这两个调度队列有什么区别?

What is the difference between these two Dispatch Queues?

我在网上看到过这段代码

 let highQueue = DispatchQueue.global(qos: .userInteractive)
 let videoDataOutputQueue = DispatchQueue(label: "com.apple.sample.capturepipeline.video", attributes: [], target: highQueue)

第二个以第一个为目标

它们之间的技术区别是什么?不都是并发的高优先级队列吗???

有一个巨大的区别:全局队列是并发的,而您的视频队列是串行的。

如果你直接提交两个块到全局队列,系统允许同时运行它们。

如果您向视频队列提交两个块,系统必须 运行 按顺序(而不是同时)提交它们。您提交的第一个块必须 return 才能允许队列调用第二个块。这意味着您可以将视频队列用作 serialization/locking 机制,以线程安全的方式访问状态。

我知道的其他差异:

  • 在 Xcode 的调试导航器中,队列的标签不同。

  • 您可以设置您创建的视频队列的自动释放频率。

  • 如果您在创建视频队列时设置服务质量 class,该 QoS 将覆盖目标队列的 QoS。

  • 您可以暂停和恢复视频队列的调度。我不确定 suspendresume 是否适用于全局队列,但如果它们适用,我确定暂停全局队列是一个 糟糕的 想法.您不知道系统可能在全局队列中排队的重要任务。

  • 您可以 setSpecific 视频队列中的值,然后使用 getSpecific 在排队到视频队列的块中访问它们。但是 getSpecific 不会 return 那些块中的值直接排队到全局队列中。出于线程安全原因,这最常用于检测何时对特定队列进行 API 调用。