iOS GCD全局队列优先级均为0.5
iOS GCD global queue priority both 0.5
我遇到的问题是为什么下面的代码打印出来的优先级是一样的?为什么是这样?非常感谢。
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)")
}
日志:
main:{number = 1, name = main}
主线程 priorities:0.5
userInteractive:{number = 3, name = (null)}
效用:{number = 5, name = (null)}
背景:{number = 6, name = (null)}
线程用户交互 priorities:0.5
userInitiated:{number = 4, name = (null)}
线程实用程序 priorities:0.5
线程背景priorities:0.5
线程用户启动priorities:0.5
如您在文档中所见:
@available(iOS 4.0, *)
open var threadPriority: Double // To be deprecated; use qualityOfService below
threadPriority 已弃用。此外,Apple 的 GCD 团队在 Thread - Queue 主题上已经非常清楚。 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 出现队列之前我们习惯的概念截然不同。
我遇到的问题是为什么下面的代码打印出来的优先级是一样的?为什么是这样?非常感谢。
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)")
}
日志:
main:{number = 1, name = main} 主线程 priorities:0.5
userInteractive:{number = 3, name = (null)}
效用:{number = 5, name = (null)}
背景:{number = 6, name = (null)}
线程用户交互 priorities:0.5
userInitiated:{number = 4, name = (null)}
线程实用程序 priorities:0.5
线程背景priorities:0.5
线程用户启动priorities:0.5
如您在文档中所见:
@available(iOS 4.0, *)
open var threadPriority: Double // To be deprecated; use qualityOfService below
threadPriority 已弃用。此外,Apple 的 GCD 团队在 Thread - Queue 主题上已经非常清楚。 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 出现队列之前我们习惯的概念截然不同。