这两个Dispatch Queues有什么区别?

问题描述 投票:1回答:1

我已经在网上看到了这个代码

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

第二个使用第一个作为目标。

它们之间有什么技术差异?是不是并发高优先级队列???

ios cocoa grand-central-dispatch dispatch-async
1个回答
4
投票

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

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

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

我所知道的其他差异:

  • 在Xcode的调试导航器中,队列的标记方式不同。
  • 您可以设置您创建的视频队列的自动释放频率。
  • 如果在创建视频队列时在视图队列上设置了服务质量类,则该QoS将覆盖目标队列的QoS。
  • 您可以暂停和恢复视频队列的调度。我不确定suspendresume是否在全局队列上工作,但如果他们这样做,我肯定暂停全局队列是一个坏主意。您不知道系统可能在全局队列上排队的重要任务。
  • 您可以在视频队列中使用setSpecific值,然后使用getSpecific在排队到视频队列的块中访问它们。但是getSpecific不会在直接排队到全局队列的块中返回这些值。出于线程安全的原因,这通常用于检测何时在特定队列上进行API调用。
© www.soinside.com 2019 - 2024. All rights reserved.