В чем разница между этими двумя очередями отправки? - PullRequest
0 голосов
/ 23 февраля 2019

Я видел, как этот код использовался в Интернете

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

Второй использует первый в качестве цели.

В чем техническая разница между ними?Не являются ли обе одновременные очереди с высоким приоритетом ???

1 Ответ

0 голосов
/ 23 февраля 2019

Существует огромная разница: глобальная очередь является параллельной, в то время как ваша видео-очередь последовательная.

Если вы отправляете два блока напрямую в глобальную очередь, системе разрешается запускать их одновременно.

Если вы отправляете два блока в свою очередь видео, система должна запускать их последовательно (а не одновременно).Первый отправленный вами блок должен быть возвращен до того, как очередь сможет вызвать второй блок.Это означает, что вы можете использовать свою очередь видео в качестве механизма сериализации / блокировки для доступа к состоянию потокобезопасным способом.

Другие известные мне различия:

  • В навигаторе отладки Xcode очереди помечаются по-разному.

  • Вы можете установить частоту автоматического выпуска созданной вами видео-очереди.

  • Если вы установили класс качества обслуживания в видео-очереди при его создании, это QoS переопределит QoS целевой очереди.

  • Вы можете приостановить и возобновить диспетчеризацию на своемвидео очередь.Я не уверен, работают ли suspend и resume в глобальной очереди, но если они это делают, я уверен, что приостановка глобальной очереди - это плохая идея.Вы не знаете, какие важные задачи система может ставить в очередь в глобальных очередях.

  • Вы можете setSpecific значения в вашей видео-очереди, а затем получить к ним доступ, используя getSpecific вблоки, поставленные в очередь в видео-очереди.Но getSpecific не вернет эти значения в блоках, поставленных в очередь непосредственно в глобальную очередь.Это чаще всего используется для определения того, когда вызовы API выполняются в определенной очереди, из соображений безопасности потока.

...