了解GCD块内的的行为

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

来自: 问题与GCD和太多的线程

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

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

我唯一的问题是[NSURLConnection sendAsynchronousRequest:queue:completionHandler: [NSURLConnection sendAsynchronousRequest:queue:completionHandler: NSData dataWithContentsOfURL:URL]在创build新线程和节省我们被阻止?方面。

真的很感谢你的任何logging的答案。

您的问题不是关于GCD:这是关于同时下载多个文件的最佳策略。

最好的策略就是不做 。 试图同时下载100个单独的文件是一个坏主意 ,特别是如果用户在蜂窝连接(他们可能是)。 你是正确的,以确定dataWithContentsOfURL通常也不是一个好主意。

也就是说,这里有一个中间的地方。 如果有一种方法可以告诉iOS“一次下载X个文件,但是不会超过这个数目”,那将会很不错。 要做到这一点,我们可以使用NSOperationQueue 。 操作队列包含许多操作并将它们放入队列(在这种情况下,在后台运行)。 例如:

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

这里我们创build了一个可以支持三个同时下载的操作队列。 使用操作队列的好处应该是显而易见的。 许多开发人员select使用像AFNetworking这样的库来帮助他们pipe理下载,并且在操作队列中使用this和NSURLConnection有很多指导。

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