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

时间:2020-02-25 12:36:51

标签: swift grand-central-dispatch 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,标志:DispatchWorkItemFlags,执行:()-> Void)

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

我想知道当这些QOS不同时如何提升QOS。

1 个答案:

答案 0 :(得分:1)

您已概述了三种指定服务质量(QoS)的方法。但是后两个实际上是相同的,只有一个使用块,另一个DispatchWorkItem。因此,让我们集中讨论这两个QoS维度,即队列和已分派任务的QoS。

简而言之,队列QoS优先于调度项的QoS,除非以下任何一项:

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

坦率地说,在大多数情况下,我们只是设置队列QoS并称之为一天。内容清晰,简洁,可以很容易地推断出我们的代码。可以在任务级别指定QoS,但这种情况不太常见。并且为队列和已调度项目同时指定QoS并用.enforceQoS标志覆盖QoS是很不常见的。

有关一般QoS的更多信息,请参阅WWDC 2015 Building Responsive and Efficient Apps with GCD和WWDC 2016 Concurrent Programming With GCD in Swift 3。第一个视频向我们介绍了QoS(并且,正如您所看到的,当他们介绍此主题时,重点是在调度队列中),但是该视频虽然使用了Swift 2语法,但是概念没有改变。第二个视频向我们介绍了现代Swift语法,并简要回顾了先前视频的许多讨论。

有各种各样有趣(且不寻常)的极端情况(例如,GCD对优先级倒置的处理),但这已在以上视频中进行了讨论,这不在此问题的范围内。