我试图增加在并发队列中执行的块的优先级。我建议将强制标记标记用于此目的。正如苹果文件所说:

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

假设有一个队列:

/// 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 */ }

我的问题很简单:苹果是否保证item2尽早执行?

我在操场上玩了一点,不幸的是没有发现这个标志的任何优势,结果绝对是混乱的。官方文档也无济于事。

非常感谢。

最佳答案

这里的“优先”并不意味着“早点运行”。这意味着“在确定要为该块分配的QoS时,请优先选择此处给定的QoS,而不是当前执行上下文建议的质量(如果此处给定的QoS高于此块应接收的质量)”。

如果您要求item2在item1之前运行,请使用notify对其进行排序:

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

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

10-06 02:55