使用dispatch_async,使用您自己的个别队列或您自己的全局队列?

时间:2014-09-29 06:20:58

标签: ios grand-central-dispatch

所以当使用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 ..与此无关......我只是说你可以创建自己的一个队列并且总是使用相同的队列。)

我从来没有真正理解一种方法是否优先,或者是否存在与这两种方法或任何其他问题相关的危险。

简而言之,使用哪种方式?

2 个答案:

答案 0 :(得分:3)

这些替代方案完成了截然不同的事情。如果每次都创建一个新队列,那么所有队列都可以立即运行。如果你总是使用相同的(串行;不适用于并发的)队列,它上面的块将按顺序一次运行一个。

您通常会在以下两种情况中使用后者:

  • 保护一次不使用线程安全的东西(最常见的串行队列使用)

  • 有意减少应用中的并发数以节省资源(无论是内存,服务器连接还是内容)。

答案 1 :(得分:1)

除了来自@Catfish_Man的答案之外,请考虑您目前无法控制同时运行的下载次数,并且如果用户改变主意,您将无法取消下载。你是否真的想让用户在请求另一个之前等待一件事,或者冒着充斥网络请求并让它们全部失败的风险?

一般来说,你真的应该使用GCD,还是应该选择更高级别的NSOperationQueue API。

直接使用GCD,虽然它可能提供“最少编写代码”,但确实存在缺陷/妥协,您应该在使用该方法之前了解它们。