ios 具有qos_class_user_interactive的全局队列

6ioyuze2  于 2023-08-08  发布在  iOS
关注(0)|答案(2)|浏览(91)

我试着理解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比3和5更高?

谢谢你们!

yws3nbqq

yws3nbqq1#

请记住:这是多线程,在多核设备上,将输出写入日志,您不知道线程安全和内部管理...
上面写着:

  1. 1是第一个因为它是同步的
  2. 2是第二个因为它也是同步的
  3. 3不是下一个,因为它被推到了等待在主线程运行循环中运行的队列中,而你不知道队列中还有什么东西
  4. 5在3之前,因为它(基本上)具有相同的优先级,但是它运行在一个队列上,而队列可能没有其他等待的东西(QOS_CLASS_USER_INTERACTIVE ~=主线程优先级)
    注意,我说~=是因为我还没有检查确切的值,它可能会略有不同,尽管我希望优先级值匹配,否则'interactive'就没有什么意义了...
ha5z0ras

ha5z0ras2#

其结果是优先级的顺序。QOS_CLASS_USER_INTERACTIVE表示用户为地面进程,因此优先级最高QOS_CLASS_USER_INITIATED表示用户正在等待作业的结果,因此优先级非常高。当用户看到所有内容及其作业时,主队列是正常的工作负载。

相关问题