请考虑以下声明:
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + .milliseconds(500), qos: .utility, flags: .noQoS) {
print("What is my QOS?")
}
请注意有多少参数是指服务质量。如何通过一种凡人的可能性来理清排列?
答案 0 :(得分:2)
一般来说,你不应该试图理清所有这些排列。在大多数情况下,使用QoS搞乱太多是一个麻烦的方法。但是有相当简单的规则。
队列具有优先级,他们可以将该优先级分配给请求继承的块。
此特定块明确请求较低优先级,但随后说“忽略我的QoS请求”。通常,不要这样做。我知道这样做的唯一原因是,如果您正在与一些不了解QoS的传统API进行交互。 (我自己从未遇到过这种情况,很难想象它会出现在用户级代码中。)
一个更有趣的问题IMO(以及在实际代码中经常出现的问题)就是这个问题:
DispatchQueue.global(qos: .utility).async(qos: .userInitiated) {}
这个区块的优先级是什么?答案是.userInitiated
,块将把它的优先级“借”给队列,直到它完成执行。因此,在一段时间内,整个队列将变为.userInitiated
。这是为了防止优先级倒置(高优先级任务阻塞等待低优先级任务)。
这一点都在Concurrent Programming With GCD in Swift 3中进行了深入讨论,这对任何对非平凡GCD感兴趣的人都是必须关注的。