了解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。