0

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

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

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

谢谢!

编辑 - 以下是在一个 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]
4

3 回答 3

2

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

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

于 2012-07-24T03:16:29.950 回答
1

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

于 2012-07-24T03:33:03.437 回答
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 异步加载远程图像的方法。

于 2012-07-24T03:00:41.257 回答