我想将 GCD 用于一百个对象,这些对象都需要从服务器下载一些数据。如果我要遍历这些对象,并调用类似:
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
// Download data;
});
这些块会被智能排队并高效执行,还是我会遇到内存问题、性能问题,甚至是竞争条件?
我的两分钱是,顾名思义,块将排队,下载将一次开始一个,只要我在应用程序在所有下载完成之前终止时正确清理,就不应该有问题。
然而,另一个额外的问题:
如果我要创建 3-5 个队列并通过在队列之间分配下载来一次下载多个文件,我会受益更多吗?
实现了这个功能后,似乎接受的答案并不完整,或者我错过了重点。在全局队列(即并发队列)上调度块可能会导致问题,因为 GCD 可以调度的线程数是最大的(~64)。这仅适用于并发队列,因为它们需要为每个操作生成一个线程。但是,如果您创建自己的队列,则该队列将是一个顺序队列,一个接一个地执行块,即使在dispatch_async
被调用时也是如此。这样,您可以确定您的队列只会产生 1 个线程,并将您的操作排队,并且永远不会遇到线程限制问题。