iOS关闭背景线程

时间:2012-07-24 01:37:21

标签: ios xcode multithreading memory

在我的ViewController中,我从互联网上下载了一些png文件,并将它们添加到UIImageViews中,我将其添加到UIScrollView中。

但是,如果用户按下导航栏中的后退按钮,我注意到后台线程仍在继续下载这些文件。另外,我注意到了巨大的内存峰值,我认为我的对象没有被正确释放。

当用户在导航栏中按回来时,如何关闭所有线程? xcode 4.2.1,ARC

谢谢!

编辑 - 以下是for循环

NSURL* url = [[NSURL alloc] initWithString:[@"someurl"]];
NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];
UIImage* image = [[UIImage alloc] initWithData:imageData];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = aFrame;
[self.screenshots addSubview:imageView]

3 个答案:

答案 0 :(得分:2)

您不应该在视图控制器中进行任何下载。这就是问题的根源。将数据移动到模型类中。在那里完成所有下载和数据管理。视图控制器负责从模型中提取数据并将其提供给视图。视图控制器不负责从网络中获取数据。正如你所发现的那样,它们随时都会消失。

您不希望中止下载,然后每当有人在屏幕之间移动时重新启动它们。您希望让模型类知道需要一些数据(因为用户来到屏幕),然后您希望模型类发布通知(或提供KVO更改通知),让视图控制器知道新的数据被读取。

答案 1 :(得分:1)

您可能需要考虑NSOperationQueue并通过添加新的下载操作。 NSURLConnection并添加你的NSOperationQueue。您可以一次下载多个源,并在需要时立即取消所有操作。您还可以设置一次下载多少内容。

答案 2 :(得分:0)

试试这个:

在你的for循环中,创建一个条件,当你不再需要它时会停止下载:

声明类变量或正确

BOOL stopDownloading;

在您开始下载时将其设置为false:

stopDownloading = NO;

修改你的for循环,当你将它设置为NO时停止:

if (!stopDownloading) {
    NSURL* url = [[NSURL alloc] initWithString:[@"someurl"]];
    NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];
    UIImage* image = [[UIImage alloc] initWithData:imageData];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = aFrame;
    [self.screenshots addSubview:imageView];
}

现在,当按下后退按钮时,设置

stopDownloading = YES;

它会停止所有进一步的下载,但是由于你的设置,我没有立即看到一种方法来阻止当前正在下载的那个(只有后续的)。 要解决这个问题,我会创建一个NSOperationQueue并为每次下载添加NSOperations。

甚至更简单,使用一些现有的开源解决方案,如AFNetworking。特别是这两个:

AFImageRequestOperation AFHTTPRequestOperation的子类,用于下载和处理图像。

UIImageView+AFNetworkingUIImageView添加方法,以便从URL异步加载远程图像。

相关问题