我试图理解 GCD 并编写了这段代码来找出运行优先级:
override func viewDidLoad() {
super.viewDidLoad()
fetchImage()
print(1)
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
print(2)
}
dispatch_async(dispatch_get_main_queue()) {
print(3)
}
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
print(5)
}
}
我在控制台中得到了下一个结果:
1
2
5
3
那么问题是:
第 1 部分:为什么 3 在 5 之后(main_queue 具有最高优先级?)
第 2 部分:为什么 2 也高于 3 和 5?
谢谢大家!
最佳答案
切记:这是多线程,在多核设备上,将输出写入日志,你不知道线程安全和内部管理……
也就是说:
- 1 是第一个,因为它是同步的
- 2 是第二个,因为它也是同步的
- 3 不是下一个,因为它被插入等待在主线程运行循环上运行的事物队列,而您不知道该队列中已经有什么
- 5 在 3 之前,因为它(基本上)具有相同的优先级,但它在可能没有任何其他等待的队列上运行(
QOS_CLASS_USER_INTERACTIVE
~= 主线程优先级)
请注意,我说 ~= 是因为我没有检查确切的值,尽管我希望优先级值匹配,但它可能略有不同,否则“交互式”意义不大...
关于ios - 带有 qos_class_user_interactive 的 global_queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735946/