ios - .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 提前执行?
我在操场上玩了一会儿,可惜没有透露出这面旗帜的任何优势,结果绝对混乱。官方文档在这件事上也没有帮助。
非常感谢。
解决方案
这里的“优先”并不意味着“运行得更快”。它的意思是“在决定为这个块分配哪个 QoS 时,更喜欢这里给定的那个,而不是当前执行上下文建议的那个(如果这里给出的那个高于这个块本来会收到的那个)。”
如果您要求 item2 在 item1 之前运行,则使用notify
来订购它们:
item2.notify(queue: concurrentQueue, execute: item1)
在任何情况下,您都不应该尝试使用 QoS 来订购工作项目。QoS 是一个复杂的系统,不仅包括优先级;它还包括设备是否处于节能模式等内容。根据每个服务级别的描述,为项目分配与其意图相匹配的 QoS。如果您需要按特定顺序运行,请使用依赖项(如notify
)对它们进行排序。
推荐阅读
- python - 导入 Psycopg2 时出现问题
- ios - 如何使用 swift 以纵向模式捕获图像
- node.js - 如何使用特定于浏览器的 vanilla JS 库来响应依赖项
- python - Pandas 按类型将列值组合成一行的单元格
- javascript - 弹出脚本复制后台脚本网络活动 - Chrome 扩展
- css - 使用css添加垂直滚动条时如何不裁剪下拉菜单?
- javascript - 当我单击最后一个进度按钮并让进度完成时,滑块不会返回开始而是消失?
- django - 如何确定 django 模型的正确布局?
- reactjs - 按下按钮后如何显示下拉列表?
- flask - Flask/Flask-restful:为 POST 请求强制/正确/覆盖不正确的内容类型标头