Ios 如何实现下载队列和活动连接管理?

Ios 如何实现下载队列和活动连接管理?,ios,objective-c,Ios,Objective C,我有一个应用程序,每个屏幕都需要从RESTAPI加载一些图像(甚至可能是50个)和一些JSON。问题是,用户可以在所有图像加载之前更改屏幕,当新屏幕出现时,他们会继续下载,这是不好的 我的最终目标是能够在屏幕更改时取消所有活动下载。即使图像尚未完成下载。 有一个队列同时下载不超过5张图片也不错。 以下是我现在下载图像的方式: // global queue NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString

我有一个应用程序,每个屏幕都需要从RESTAPI加载一些图像(甚至可能是50个)和一些JSON。问题是,用户可以在所有图像加载之前更改屏幕,当新屏幕出现时,他们会继续下载,这是不好的

我的最终目标是能够在屏幕更改时取消所有活动下载。即使图像尚未完成下载。

有一个队列同时下载不超过5张图片也不错。 以下是我现在下载图像的方式:

// global queue
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[self.data objectForKey:@"image_url"]]];
self.image = [UIImage imageWithData:imageData];

dispatch_async(dispatch_get_main_queue(), ^{
    [[DataManager sharedManager] storeImageData:self.image forImageWithID:self.imageID];
    [self.delegate downloadedImage:self];
});

您应该使用操作队列而不是GCD。通过这种方式,您可以一次将其限制为五个并发请求,并且它们是可取消的。您还应该使用
NSURLConnection
而不是
dataWithContentsOfURL
,以便在下载过程中取消它

不过,将
NSURLConnection
放在
NSOperation
中可能很棘手(因为您必须在runloop中安排它)。可能最简单的方法是利用第三方类,例如


如果将操作添加到自己的队列中,只需将其设置为
5
,如果要取消操作,只需调用


根据您使用图像的方式,您可能会考虑根本不将图像加载到数组中。例如,如果只是在 UIIVIEVIEW 对象中填充图像,请考虑使用<代码> UIIVIEVIEW 类别,如AfNoad的类别:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
或者您可以使用提供稍微丰富一点的
UIImageView
类别。它提供了自己的
UIImageView
方法


但是如果使用
UIImageView
类别,则可以使用“延迟加载”,仅在创建图像视图时加载图像。这是用户界面的理想选择,如
UITableView
UICollectionView

要使用
NSOperation
下载数据,可以选择开始使用。你不应该使用initWithURL选项,因为它不会让你对正在发生的事情有足够的控制。但是如何取消与该框架的所有活动连接?这是我的问题。我在自述文件中没有看到此类信息。如果您将操作添加到自己的队列中,则可以执行标准的
NSOperationQueue
方法。相应地更新了答案。我可以使用AFNetworking框架来实现这一点,还是必须实现自己的NSOperationQueue、子类NSOperation等?@NikolayDyankov AFNetworking创建从
NSOperation
子类化的对象。因此,您只需将它们添加到您创建和配置的
NSOperationQueue
。您还可以使用框架的
AFHTTPClient
,它为您创建一个操作队列。目前为止还不错,但我需要能够取消正在下载的图像。必须等待队列中的所有5个图像下载,这在一定程度上扼杀了拥有此队列的意义。而且3G连接可能需要相当长的等待时间。