Ios 使用dispatch_async,使用您自己的单个队列还是您自己的全局队列?

Ios 使用dispatch_async,使用您自己的单个队列还是您自己的全局队列?,ios,grand-central-dispatch,Ios,Grand Central Dispatch,所以当使用dispatch\u 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(dis

所以当使用dispatch\u 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);
请注意,我正在为该调用创建一个队列“就在那里”

因此,应用程序中的每一个这样的调用都只是创建自己的队列“在那里然后”使用

或者,您可以只创建一个队列作为应用程序的全局队列,并将其保留,并始终使用同一个队列。(我想,你真的“永远不会发布”它只会在应用程序的生命周期中持续存在。)

(注意——我不是在说苹果的“全局队列”。。调度(dispatch)_get_global_queue.。与此无关。我只是说,您可以创建自己的一个队列,并始终使用同一个队列。)

我从来没有真正理解过一种方法是否可取,或者是否存在与之相关的危险,或者任何其他问题


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

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

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

  • 保护非线程安全的内容不被多个线程同时使用(最常用的串行队列)

  • 有意减少应用程序中的并发量以节省资源(无论是内存、服务器连接还是其他)


除了@ CasdFixman的答案之外,考虑到目前你无法控制你同时运行的下载量,如果用户改变主意,你就没有能力取消下载。您真的想让用户在请求另一个请求之前等待一件事情,还是冒着请求充斥网络并导致所有请求都失败的风险

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


直接使用GCD,虽然它可以提供“最少的代码编写”,但它确实存在缺点/折衷,在使用该方法之前,您应该了解这些缺点/折衷。

非常好,谢谢!要想一想:)只有一个问题,你提到的东西:如果你正在使用(你自己的)并发队列。事实上:做不止一件事是完全没有意义的吗?TBC,创建多个您自己的并发队列与仅使用一个您自己的并发队列相比,没有任何优势/区别/劣势?(在这篇评论中,我只是想问一下并发队列的附带问题!!)谢谢!!有一个重要的例子:dispatch\u barrier\u async()。除此之外,还有一些棘手的方面是有用的(队列优先级、重新定位队列、挂起队列等),但对于一般的“只需为我做一些线程安全工作”的情况,您也可以只使用全局队列,而不必费心创建自己的队列。嗨,Wain-这完全正确。(还请注意我的另一个问题-哪条鲶鱼也是A'd!!:)这里我只是想弄清楚当(如果你使用dispatch_async)你使用“每次新队列”而不是“你自己的一个队列”时到底发生了什么。。。