我遇到的问题是为什么下面的代码打印出来的优先级是一样的?为什么是这样?非常感谢。
print("main:\(Thread.current)")
print("thread main priorities:\(Thread.current.threadPriority)")
DispatchQueue.global(qos: .utility).async {
print("utility:\(Thread.current)")
print("thread utility priorities:\(Thread.current.threadPriority)")
}
DispatchQueue.global(qos: .background).async {
print("background:\(Thread.current)")
print("thread background priorities:\(Thread.current.threadPriority)")
}
DispatchQueue.global(qos: .userInteractive).async {
print("userInteractive:\(Thread.current)")
print("thread userInteractive priorities:\(Thread.current.threadPriority)")
}
DispatchQueue.global(qos: .userInitiated).async {
print("userInitiated:\(Thread.current)")
print("thread userInitiated priorities:\(Thread.current.threadPriority)")
}
日志:
主要:{数字= 1,名称=主要} 线程主优先级:0.5
用户交互:{number = 3,name = (null)}
实用程序:{number = 5,name = (null)}
背景:{数字= 6,名称=(空)}
线程用户交互优先级:0.5
用户启动:{number = 4,name = (null)}
线程实用程序优先级:0.5
线程后台优先级:0.5
线程用户启动优先级:0.5
最佳答案
正如您在文档中看到的:
@available(iOS 4.0, *)
open var threadPriority: Double // To be deprecated; use qualityOfService below
threadPriority 已弃用。另外,Apple 的 GCD 团队对于线程 - 队列主题已经非常明确。 GCD 将为您管理线程。队列优先级不是线程优先级。看一下这个示例,这是您在此处发布的代码,几乎,我刚刚添加了“qos_class_self().rawValue”,这实际上是您应该测试 QoS 的方式,而不是使用“threadPriority”。
print("main:\(Thread.current), Thread main priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
DispatchQueue.global(qos: .utility).async {
print("utility:\(Thread.current), Thread utility priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}
DispatchQueue.global(qos: .background).async {
print("background:\(Thread.current), Thread background priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}
DispatchQueue.global(qos: .userInteractive).async {
print("userInteractive:\(Thread.current), Thread userInteractive priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}
DispatchQueue.global(qos: .userInitiated).async {
print("userInitiated:\(Thread.current), Thread userInitiated priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}
我还组合了每个闭合的打印,这样它们就不会在日志中的不同行中被打乱。这表明 QoS 得到维护,而 threadPriority 已被弃用。
main:<NSThread: 0x6100000762c0>{number = 1, name = main}, Thread main priorities:0.5, QoS: 33
userInteractive:<NSThread: 0x610000261fc0>{number = 4, name = (null)}, Thread userInteractive priorities:0.5, QoS: 33
utility:<NSThread: 0x618000079100>{number = 3, name = (null)}, Thread utility priorities:0.5, QoS: 17
userInitiated:<NSThread: 0x608000078380>{number = 5, name = (null)}, Thread userInitiated priorities:0.5, QoS: 25
background:<NSThread: 0x610000262000>{number = 6, name = (null)}, Thread background priorities:0.5, QoS: 9
所以,最后,要点不是考虑线程,而是考虑队列、它们的 QoS,并知道 GCD 将为您管理线程。这与我们在 GCD 出现队列之前所习惯的概念非常不同。
关于iOS GCD 全局队列优先级均为 0.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358144/