DispatchQueue - QOS 混乱

Ver*_*con 4 ios swift

请考虑以下声明:

DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + .milliseconds(500), qos: .utility, flags: .noQoS) {
    print("What is my QOS?")
}
Run Code Online (Sandbox Code Playgroud)

请注意有多少参数涉及服务质量。仅仅一个凡人的可能性怎么能解决这些排列呢?

Rob*_*ier 5

一般来说,您不应该尝试整理所有这些排列。在大多数情况下,过多地处理 QoS 会带来麻烦。但有相当简单的规则。

队列具有优先级,并且它们可以将该优先级分配给请求继承的块。

该特定块明确请求较低优先级,但随后表示“忽略我的 QoS 请求”。一般来说,不要这样做。据我所知,这样做的唯一原因是您正在与一些不了解 QoS 的旧版 API 进行交互。(我自己从未遇到过这种情况,并且很难想象它会出现在用户级代码中。)

在我看来,一个更有趣的问题(在实际代码中更常出现的问题)是:

DispatchQueue.global(qos: .utility).async(qos: .userInitiated) {}
Run Code Online (Sandbox Code Playgroud)

该块的优先级是什么?答案是.userInitiated,块会将其优先级“借用”给队列,直到执行完毕。所以在一段时间内,整个队列将变成.userInitiated。这是为了防止优先级反转(高优先级任务阻塞等待低优先级任务)。

这一切都在《Swift 3 中的 GCD 并发编程》中进行了深入讨论,对于任何对非平凡 GCD 感兴趣的人来说,这都是必看的内容。