所有的DISPATCH_QUEUE_PRIORITY_X队列都是并发队列(意味着它们可以同时执行多个任务),并且是FIFO的,这意味着给定队列内的任务将按照“先进先出”的顺序开始执行。与此相比,主队列(从dispatch_get_main_queue()获取)是一个串行队列(任务将按照接收顺序开始执行和完成执行)。
因此,如果您向DISPATCH_QUEUE_PRIORITY_DEFAULT发送1000个dispatch_async()块,则这些任务将按照您将它们发送到队列中的顺序开始执行。同样适用于HIGH、LOW和BACKGROUND队列。您发送到这些队列中的任何内容都在后台上的不同线程上执行,远离主应用程序线程。因此,这些队列适合执行后台下载、压缩、计算等任务。
请注意,每个队列的执行顺序都是以FIFO为基础的。因此,如果您将1000个dispatch_async()任务均匀分割并按顺序发送到四个不同的并发队列BACKGROUND、LOW、DEFAULT和HIGH中(即您在HIGH队列上调度最后的250个任务),那么您看到开始执行的第一个任务很可能是在HIGH队列上,因为系统已经理解了您需要尽快将这些任务提交到CPU中。
请注意,我说“将按顺序开始执行”,但请记住,作为并发队列,根据每个任务所需的时间长度,它们不一定会以相同的顺序完成执行。
根据苹果公司的说法:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
一个并发调度队列在你有多个可以并行运行的任务时非常有用。并发队列仍然是一个队列,因为它按照先进先出的顺序出队任务;但是,并发队列可能在任何之前的任务完成之前出队其他任务。由并发队列执行的任务数量在任何给定时刻是可变的,并且随着应用程序中的条件变化而动态改变。许多因素会影响并发队列执行的任务数量,包括可用核心数、其他进程正在执行的工作量以及其他串行调度队列中任务的数量和优先级。
基本上,如果您将这1000个dispatch_async()块发送到默认、高、低或后台队列,它们将按照您发送它们的顺序开始执行。然而,较短的任务可能会在较长的任务之前完成。造成这种情况的原因是如果有可用的CPU核心或者当前队列的任务正在执行计算非密集型的工作(从而使系统认为它可以并行分派其他任务,而不考虑核心数)。
并发级别完全由系统处理,并基于系统负载和其他内部确定的因素。这就是Grand Central Dispatch(dispatch_async()系统)的美妙之处 - 你只需将工作单元设置为代码块,为它们设置一个优先级(基于你选择的队列),然后让系统处理其余部分。
所以回答你上面的问题:你部分正确。你正在“要求该代码”在指定的优先级全局并发队列上执行并发任务。块中的代码将在后台执行,任何其他(类似的)代码都可能会并行执行,具体取决于系统对可用资源的评估。
另一方面,“主”队列(来自dispatch_get_main_queue())是一个串行队列(不是并发队列)。发送到主队列的任务将始终按顺序执行,并且将始终按顺序完成。这些任务也将在UI线程上执行,因此适合使用进度消息、完成通知等更新您的UI。
dispatch_get_global_queue
保存在一个变量类型为dispatch_queue_t myQueue
中。只传递myQueue到你的dispatch_async
中会更易读。 - Alex Cio