请考虑以下声明:
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + .milliseconds(500), qos: .utility, flags: .noQoS) {
print("What is my QOS?")
}注意,有多少参数引用了服务质量。一个仅仅是凡人的可能性,如何才能理清排列?
发布于 2017-01-17 16:04:20
一般来说,你不应该试图理清所有这些排列。在大多数情况下,过多地使用QoS会带来麻烦。但是有一些相当简单的规则。
队列具有优先级,并且它们可以将该优先级分配给请求继承的块。
这个特定的块显式地请求一个较低的优先级,但是接着说“忽略我的QoS请求”。作为一条规则,不要那样做。我知道这样做的唯一原因是如果您正在与一些不了解QoS的遗留API交互。(我自己从未遇到过这种情况,很难想象它会出现在用户级代码中。)
一个更有趣的问题(也是在实际代码中经常出现的问题)是这个问题:
DispatchQueue.global(qos: .utility).async(qos: .userInitiated) {}这个街区的优先级是什么?答案是.userInitiated,这个块将把它的优先级“借给”队列,直到它完成执行。因此,在一段时间内,整个队列将变成.userInitiated。这是为了防止优先级反转(其中高优先级任务阻止等待低优先级任务)。
所有这些都在Swift 3中的GCD并发编程中进行了深入的讨论,对于对非平凡的GCD感兴趣的人来说,这是一个必须注意的问题。
https://stackoverflow.com/questions/41701148
复制相似问题