dispatch_get_global_queue和dispatch_queue_create有什么区别?

我正在写一个适度复杂的iOS程序,需要多个线程的一些较长的操作(parsing,连接到networking等)。 不过,我很困惑dispatch_get_global_queuedispatch_queue_create之间有什么不同。

我应该使用哪一个,能给我一个简单的解释,说明一般的区别? 谢谢。

正如文档中所描述的,全局队列对于并发任务是有利的(即,你将asynchronous地调度各种任务,如果它们同时运行,你将感到非常高兴),并且如果你不想遇到创build和破坏你自己的队列。

如果您需要一个串行队列(即,您需要一次执行一个分派的块),创build自己的队列将非常有用。 这在许多情况下都很有用,比如每个任务都依赖于前一个任务,或者协调与来自多个线程的共享资源的交互。

较不常见,但是如果您需要结合并发队列使用障碍 ,您也将需要创build自己的队列。 在这种情况下,创build一个并发队列(即dispatch_queue_createDISPATCH_QUEUE_CONCURRENT选项),并与该队列结合使用障碍。 你不应该在全球排队上使用障碍。

我的一般顾问是如果你需要一个串行队列(或需要使用障碍),然后创build一个队列。 如果你不这样做,继续使用全局队列,并绕过创build自己的开销。


如果你想要一个并发队列,但想要控制可以同时运行多less个操作,你也可以考虑使用具有maxConcurrentOperationCount属性的maxConcurrentOperationCount 。 这在执行networking操作时非常有用,并且不需要将太多并发请求提交到服务器。

刚刚发布了一个不同的答案,但这里是我写了一段时间的东西:

队列概念化的最好方法是首先意识到,在最低层次上,只有两种types的队列:串行和并发。

串行队列是一夫一妻制,但未提交。 如果你给每个串行队列分配一堆任务,它将一次只运行一个,每次只使用一个线程。 未提交的方面是串行队列可能切换到任务之间的不同线程。 串行队列总是等待任务完成,然后再进入下一个任务。 因此任务按先进先出顺序完成。 您可以使用dispatch_queue_create创build尽可能多的串行队列。

主队列是一个特殊的串行队列。 不像其他串行队列那样,它们是“约会”许multithreading,但是只有一个线程,主队列与主线程“结合”,所有任务都在其上执行。 主队列上的作业需要与runloop很好地配合,以便小的操作不会阻塞UI和其他重要的位。 像所有的串行队列一样,任务按FIFO顺序完成。

如果串行队列是一夫一妻的,那么并发队列是混杂的。 他们将提交任务到任何可用的线程,甚至根据系统负载进行新线程。 他们可以在不同的线程上同时执行多个任务。 提交给全局队列的任务是线程安全的,并尽可能减less副作用。 任务按FIFO顺序提交执行,但不保证完成顺序。 在撰写本文时,只有三个并发队列,您不能创build它们,只能使用dispatch_get_global_queue来获取它们。

编辑:博客文章扩大这个答案: http : //amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

一个返回现有的全局队列,另一个创build一个新的队列。 而不是使用GCD,我会考虑使用NSOperation和操作队列。 您可以在本指南中find关于它的更多信息。 通常,您希望操作同时执行,您想要创build自己的队列并将其中的操作。