ios - 带有 qos_class_user_interactive 的 global_queue

标签 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_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. 1 是第一个,因为它是同步的
  2. 2 是第二个,因为它也是同步的
  3. 3 不是下一个,因为它被插入等待在主线程运行循环上运行的事物队列,而您不知道该队列中已经有什么
  4. 5 在 3 之前,因为它(基本上)具有相同的优先级,但它在可能没有任何其他等待的队列上运行(QOS_CLASS_USER_INTERACTIVE ~= 主线程优先级)

请注意,我说 ~= 是因为我没有检查确切的值,尽管我希望优先级值匹配,但它可能略有不同,否则“交互式”意义不大...

关于ios - 带有 qos_class_user_interactive 的 global_queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735946/

相关文章:

iphone - 从 coredata swift 获取特定属性

ios - GCD dispatch_async 是否等待 NSLog()?

swift 3 : Async queue is still blocking main thread/freezing app?

ios - 在 getter 中的后台线程上进行大量计算

ios - UILabel 圆角在 iOS 7.1 中变得尖锐

ios - 从 Swift 函数中的异步调用返回数据

ios - 核心数据、Xcode 4.5 和在数据模型中创建获取的请求

design-patterns - 快速程序接口(interface)

json - 使用 Swift 获取 Json 元素

ios - 找不到迦太基图像 Xcode 7 Carthage 0.8.0