DISPATCH_QUEUE_CONCURRENT 和全局并发调度队列有什么区别

what is the difference between DISPATCH_QUEUE_CONCURRENT and Global Concurrent Dispatch Queues

我在苹果文档中读到 here 可以使用 DISPATCH_QUEUE_CONCURRENT 和全局并发调度队列来创建并发队列,但是我不确定两者之间的区别是什么。

E.x。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ });

dispatch_queue_t queue = dispatch_queue_create("custom",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ });

我读了一些关于障碍的文章,但不确定它是如何与这两者产生关系的。谁能解释一下这两个的用例?

有四个全局并发队列,每个队列对应四个不同的优先级,它们始终存在,并且在您需要时始终存在。所以你不必创建一个并发队列来在后台执行一些块。 dispatch_get_global_queue()returns这四个队列之一。

如果需要,您可以创建自己的队列并在不再需要时将其删除。

您正在阅读有关障碍的内容:全局队列被每个人使用。在 每个人 使用的队列中使用屏障可以说是非常不礼貌的。这就是为什么你不应该在全局队列中使用障碍,只能在你自己创建的队列中使用。

在第一种情况下,您请求的是为您的应用程序提供的 "global queues" 之一。 "Anyone, anywhere, in your app" 只需询问 dispatch_get_global_queue() 即可轻松获得对该队列的引用。实际上,队列是单例。而且,几乎所有 时间,这就是您所需要的。 OS 可以帮助您构建它们,并让每个人(在您的应用程序中)都能轻松访问它们。

dispatch_queue_create() 在您真正需要 "another queue." 的极少数情况下使用它就像所有其他队列一样绑定到您的应用程序,但您自己管理它。您必须为应用程序的其他部分提供一些方法来获取该队列句柄。例如,如果在您的设计中 确实 需要将不同类型的请求放入不同的队列,您可能会这样做。

而且,正如我所说,大多数 时间,全局队列就是您真正需要的。 (OS 使它们 "really handy,",这就是 为什么 它们是 "really handy.")通常,您 "put lots of messages on just a few queues,"读者和作者之间的多或多对多或多对一关系。