首页 > 解决方案 > .enforceQoS 标志如何提高优先级?

问题描述

我试图增加并发队列中执行的块的优先级。我建议标志enforceQoS适合此目的。正如苹果文档所说:

该标志将块的服务质量等级优先于与当前执行上下文关联的等级,只要这样做不会降低服务质量。

假设有一个队列:

/// Lowest priority queue
let concurrentQueue = DispatchQueue(label: "queue.conc.test", qos: .background, attributes: .concurrent)

我们还有几个DispatchWorkItem任务,其中一些是:

let item1 = DispatchWorkItem(qos: .userInitiated) { /* execute block */ }
let item2 = DispatchWorkItem(qos: .utility, flags: .enforceQoS) { /* execute block */ }

我的问题很简单:Apple 是否保证 item2 提前执行?

我在操场上玩了一会儿,可惜没有透露出这面旗帜的任何优势,结果绝对混乱。官方文档在这件事上也没有帮助。

非常感谢。

标签: iosswiftios-multithreading

解决方案


这里的“优先”并不意味着“运行得更快”。它的意思是“在决定为这个块分配哪个 QoS 时,更喜欢这里给定的那个,而不是当前执行上下文建议的那个(如果这里给出的那个高于这个块本来会收到的那个)。”

如果您要求 item2 在 item1 之前运行,则使用notify来订购它们:

item2.notify(queue: concurrentQueue, execute: item1)

在任何情况下,您都不应该尝试使用 QoS 来订购工作项目。QoS 是一个复杂的系统,不仅包括优先级;它还包括设备是否处于节能模式等内容。根据每个服务级别的描述,为项目分配与其意图相匹配的 QoS。如果您需要按特定顺序运行,请使用依赖项(如notify)对它们进行排序。


推荐阅读