在我的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]
答案 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+AFNetworking向UIImageView
添加方法,以便从URL异步加载远程图像。