Ios 具有qos的全局队列\u类\u用户\u交互

Ios 具有qos的全局队列\u类\u用户\u交互,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我试图理解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

我试图理解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部分:为什么3在5之后(主队列具有最高优先级?)

第二部分:为什么2也比3和5高


谢谢你们

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

也就是说:

  • 1是第一个,因为它是同步的
  • 2是秒,因为它也是同步的
  • 3不是下一个,因为它被推到等待在主线程运行循环上运行的队列中,而您不知道该队列中还有什么
  • 5在3之前,因为它(基本上)具有相同的优先级,但它运行在一个队列上,该队列可能没有其他任何东西等待(
    QOS\u CLASS\u USER\u INTERACTIVE
    ~=主线程优先级)

  • 注意,我说~=是因为我没有检查确切的值,虽然我希望优先级值匹配,但它可能略有不同,否则“交互式”就没有多大意义了……

    这可能是在主线程上运行的。你是想让2同步还是错过了a?@Wain谢谢,错过了。但结果是一样的。也许你是对的,但为什么优先级较低的任务会首先运行?谢谢你的回答!所以,如果我说主队列和全局队列的优先级是QOS类用户,我会说是错的?如果我把2改为异步,什么都不会改变。因此,即使2是异步的,它也会在3和5之前,尽管它是QOS启动的。确切的顺序并不难,也不快,而且你要求操作系统运行的东西非常小,基本上不需要时间,所以它只需要运行它们。当你进入耗时的任务时,优先级将开始发挥更大的作用。你的意思是,如果我在相同的条件下执行比打印功能更重的操作,它们将打印其他顺序?@Wain 2是如何同步的?上面写着dispatch\u async。