我找到了有关如何为操作和操作队列提升QOS的文档: https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html
但是尚未找到有关dispatchQueues的任何信息。分配QOS的三种方法:
到DispatchQueue本身
当我们将任务分配到dispatchQueue时: func async(group:DispatchGroup ?, qos:DispatchQoS,标志:DispatchWorkItemFlags,执行:()-> Void)
我们可以将QOS分配给dispatchWorkItem本身
我想知道当这些QOS不同时如何提升QOS。
答案 0 :(得分:1)
您已概述了三种指定服务质量(QoS)的方法。但是后两个实际上是相同的,只有一个使用块,另一个DispatchWorkItem
。因此,让我们集中讨论这两个QoS维度,即队列和已分派任务的QoS。
简而言之,队列QoS优先于调度项的QoS,除非以下任何一项:
.unspecified
);或.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对优先级倒置的处理),但这已在以上视频中进行了讨论,这不在此问题的范围内。