DispatchQueue - QOS混乱

时间:2017-01-17 15:35:39

标签: ios swift

请考虑以下声明:

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

请注意有多少参数是指服务质量。如何通过一种凡人的可能性来理清排列?

1 个答案:

答案 0 :(得分:2)

一般来说,你不应该试图理清所有这些排列。在大多数情况下,使用QoS搞乱太多是一个麻烦的方法。但是有相当简单的规则。

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

此特定块明确请求较低优先级,但随后说“忽略我的QoS请求”。通常,不要这样做。我知道这样做的唯一原因是,如果您正在与一些不了解QoS的传统API进行交互。 (我自己从未遇到过这种情况,很难想象它会出现在用户级代码中。)

一个更有趣的问题IMO(以及在实际代码中经常出现的问题)就是这个问题:

DispatchQueue.global(qos: .utility).async(qos: .userInitiated) {}

这个区块的优先级是什么?答案是.userInitiated,块将把它的优先级“借”给队列,直到它完成执行。因此,在一段时间内,整个队列将变为.userInitiated。这是为了防止优先级倒置(高优先级任务阻塞等待低优先级任务)。

这一点都在Concurrent Programming With GCD in Swift 3中进行了深入讨论,这对任何对非平凡GCD感兴趣的人都是必须关注的。