iOS 使用 NSOperationQueue 和 AFNetworking 实现多下载功能

Posted

技术标签:

【中文标题】iOS 使用 NSOperationQueue 和 AFNetworking 实现多下载功能【英文标题】:iOS using NSOperationQueue and AFNetworking to implement multi-download feature 【发布时间】:2014-10-30 09:37:17 【问题描述】:

我正在使用 NSOperationQueue 和 AFNetworking 为我的项目实现多下载功能。我也使用 Core Data 来保存下载的信息,但我对那部分没问题。我的问题是在实际创建下载任务时。所以我是这样做的:

// create a NSOperationQueue
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.name = @"DownloadQueue";
queue.maxConcurrentOperationCount = 1;

// create an operation (AFDownloadRequestOperation is a subclass of AFHTTPRequestOperation)
AFDownloadRequestOperation *operation = // some initializations

// add the operation to the queue
[queue addOperation:operation];

// later some more operations are created and added to the queue

然后说我在队列中添加了 3 个操作。由于我将maxConcurrentOperationCount设置为1,所以队列中只有1个操作在运行,其他2个在等待:

operation 1: running
operation 2: waiting
operation 3: waiting

然后我使用pause(这是AFURLConnectionOperation的方法)暂停正在运行的操作,我希望看到2个等待操作之一开始运行,但它没有发生,2个等待操作仍在等待:

operation 1: paused
operation 2: waiting
operation 3: waiting

我仍然需要恢复操作 1 并等待它完成,然后操作 2 或 3 将开始运行。

我的问题是如何让队列中的其他操作在我暂停运行操作后运行?

另外,如果您能解释实现多下载的更好方法(具体与管理下载任务的最大数量、暂停/恢复下载任务有关),我将不胜感激

【问题讨论】:

【参考方案1】:

解决方案:

只需使用cancel 暂停操作(您需要处理操作中取消标志为“YES”的情况才能真正让操作退出)。然后队列中的所有操作都按照我的预期行为(取消一个操作,然后另一个等待的操作开始运行)

当您需要继续下载时,只需创建一个新操作,将内容从 Web 提取到相同的本地文件路径。 (在AFDownloadRequestOperation的帮助下,恢复下载效果很好)

现在我的多下载系统运行良好,如果您需要有关实施的信息,请发表评论。

【讨论】:

以上是关于iOS 使用 NSOperationQueue 和 AFNetworking 实现多下载功能的主要内容,如果未能解决你的问题,请参考以下文章

NSOperationQueue 和并发操作

使用 NSOperationQueue 执行 iOS 应用程序初始化

iOS多线程总结——NSOperation与NSOperationQueue的使用

ios多线程 -- NSOperation 简介

在 iOS 中上传时出现 NSOperationQueue(ASINetworkQueue) 问题

ios开发多线程二:NSOperationQueue的基本使用