当 QOS 较高的 dispatchWorkItem 添加到 QOS 较低的 dispatchQueue 时,服务质量 (QOS) 如何变化?

How does quality of service (QOS) change when a dispatchWorkItem of higher QOS is added to a dispatchQueue of lower QOS?

我找到了有关如何为操作和操作队列提升 QOS 的文档: https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html

但是还没有找到任何关于 dispatchQueues 的信息。 QOS分配的三种方式:

  1. 到 DispatchQueue 本身

  2. 当我们将任务分派到 dispatchQueue 时: func async(group: DispatchGroup?, qos: DispatchQoS, flags: DispatchWorkItemFlags, execute: () -> Void)

  3. 我们可以将 QOS 分配给 dispatchWorkItem 本身

我想知道当这些QOS不同的时候QOS是如何提升的

您概述了指定服务质量 (QoS) 的三种方法。但是后两者其实是一样的,只是一个是用block,一个是DispatchWorkItem。因此,让我们关注这两个 QoS 维度,即队列维度和派发任务维度。

简而言之,队列 QoS 优先于调度项目的 QoS,除非:

  • 您根本没有为队列指定 QoS(例如它的 QoS 是 .unspecified);或
  • 您确实指定了一个队列 QoS,但是您使用 .enforceQoS 标志调度了一个任务(它使任务的 QoS 优先于队列的 QoS,只要“这样做不会降低服务质量").

坦率地说,大多数时候,我们只是设置队列 QoS,然后收工。它清晰、简洁,并且很容易推理我们的代码。可以在任务级别指定 QoS,但不太常见。并且为队列和已分派的项目指定 QoS 并使用 .enforceQoS 标志覆盖 QoS 是非常不寻常的。

有关 QoS 的更多信息,请参阅 WWDC 2015 Building Responsive and Efficient Apps with GCD and WWDC 2016 Concurrent Programming With GCD in Swift 3。第一个视频向我们介绍了 QoS(正如您所见,当他们介绍这个主题时,重点是在调度队列中),但是这个视频无可否认地使用了旧的 Swift 2 语法,尽管概念没有改变。第二个视频向我们介绍了现代 Swift 语法,并简要回顾了上一个视频中的许多讨论。

有各种有趣的(和不寻常的)边缘情况(例如 GCD 对优先级倒置的处理),但这在上面的视频中已经讨论过并且超出了这个问题的范围。