我试图增加在并发队列中执行的块的优先级。我建议将强制标记标记用于此目的。正如苹果文件所说:
该标志优先于该块的服务质量类优先于与当前执行上下文关联的类,只要这样做不会降低服务质量即可。
假设有一个队列:
/// 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
)对它们进行排序。