1

以下问题/陈述仅限于我的理解,如果我在这里错了,请告诉我。

来自:GCD 问题和线程过多

转发到jackslash的答案,我想知道大多数开发人员都有使用[NSData dataWithContentsOfURL:URL]这似乎确实会阻塞(直到它完成)的习惯。如果您通过URL获取一些小细节,这可能是理想的。但是在多个进程的情况下(我意味着同时下载多个文件),GCD必须创建许多线程并且不是下载数据的完美方式。

所以一些专家建议使用调用的 GCD 抽象[NSURLConnection sendAsynchronousRequest:queue:completionHandler:来处理这种情况(并且也是理想的)。

我唯一的问题是如何在创建新线程和避免我们被阻塞方面[NSURLConnection sendAsynchronousRequest:queue:completionHandler: 发挥优势? NSData dataWithContentsOfURL:URL]

非常感谢您记录在案的任何答案。

4

2 回答 2

3

您的问题实际上与 GCD 无关:它是关于同时下载多个文件的最佳策略。

最好的策略就是不去做。尝试同时下载 100 个单独的文件是个坏主意,尤其是当用户使用蜂窝连接时(他们可能是)。你是对的,这dataWithContentsOfURL通常也不是一个好主意。

也就是说,这里有一个中间立场。如果有办法告诉 iOS“一次下载 X 个文件,但仅此而已”,那就太好了。为此,我们可以使用NSOperationQueue. 操作队列包含许多操作并将它们放入队列中(在这种情况下,队列在后台运行)。例如:

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:3];
[operationQueue addOperations:@[download1, download2, download3] waitUntilFinished:NO];

在这里,我们创建了一个可以支持三个同时下载的操作队列。使用操作队列的优势应该是显而易见的。许多开发人员选择使用类似库AFNetworking来帮助他们管理下载,并且有很多指南可以同时使用它和NSURLConnection操作队列。

于 2013-08-28T08:49:47.207 回答
1

sendAsynchronousRequest:queue:completionHandler:不使用 GCD 进行实际下载。您传入的队列仅用于执行完成块。下载本身将在其内部实现中使用低级异步套接字 API,因此不会有任何阻塞或不必要的线程创建。

于 2013-08-28T08:44:01.717 回答