所以当使用dispatch_async ...
时假设您正在建立网络连接,例如......
dispatch_queue_t otherQ = dispatch_queue_create(NULL, 0);
__weak MyClass *myself = self;
dispatch_async(otherQ,
^{
myself.searchResultsRA = [myself dataFrom:happyUrl ifError:nil];
dispatch_async(dispatch_get_main_queue(), ^{ if (after) after(); });
});
dispatch_release(otherQ);
注意我正在为那个电话“正确”创建一个队列。
因此,在应用程序中的每个调用,只需创建自己的队列“然后”使用。
或者,您可以创建一个队列作为应用程序的全局,并保留它,并始终使用该队列。 (我想,你真的“永远不会释放它”它只会坚持应用程序的生命。)
(注意 - 我不是在谈论Apple的“全局队列”..dispatch_get_global_queue ..与此无关......我只是说你可以创建自己的一个队列并且总是使用相同的队列。)
我从来没有真正理解一种方法是否优先,或者是否存在与这两种方法或任何其他问题相关的危险。
简而言之,使用哪种方式?
答案 0 :(得分:3)
这些替代方案完成了截然不同的事情。如果每次都创建一个新队列,那么所有队列都可以立即运行。如果你总是使用相同的(串行;不适用于并发的)队列,它上面的块将按顺序一次运行一个。
您通常会在以下两种情况中使用后者:
保护一次不使用线程安全的东西(最常见的串行队列使用)
有意减少应用中的并发数以节省资源(无论是内存,服务器连接还是内容)。
答案 1 :(得分:1)
除了来自@Catfish_Man的答案之外,请考虑您目前无法控制同时运行的下载次数,并且如果用户改变主意,您将无法取消下载。你是否真的想让用户在请求另一个之前等待一件事,或者冒着充斥网络请求并让它们全部失败的风险?
一般来说,你真的应该使用GCD,还是应该选择更高级别的NSOperationQueue
API。
直接使用GCD,虽然它可能提供“最少编写代码”,但确实存在缺陷/妥协,您应该在使用该方法之前了解它们。