Это тоже мой ответ. Итак, я расскажу о нашем варианте использования.
У нас есть уровень сервисов и уровень пользовательского интерфейса (среди других слоев). Слой служб выполняет задачи в фоновом режиме. (Задачи обработки данных, задачи CoreData, сетевые вызовы и т. Д.). Уровень обслуживания имеет несколько очередей операций для удовлетворения потребностей уровня пользовательского интерфейса.
Уровень пользовательского интерфейса полагается на уровень сервисов для выполнения своей работы, а затем запускает блок успешного завершения. В этом блоке может быть код UIKit. Простой вариант использования - получить все сообщения с сервера и перезагрузить представление коллекции.
Здесь мы гарантируем, что блоки, которые передаются на уровень служб, будут отправлены в очередь, в которой была вызвана служба. Поскольку dispatch_get_current_queue является устаревшим методом, мы используем NSOperationQueue.currentQueue, чтобы получить текущую очередь вызывающего. Важное примечание об этой собственности.
Вызов этого метода извне контекста выполняющейся операции обычно приводит к возврату nil.
Поскольку мы всегда вызываем наши службы в известной очереди (наши пользовательские очереди и основная очередь), это хорошо для нас работает. У нас действительно есть случаи, когда serviceA может вызвать serviceB, который может вызвать serviceC. Поскольку мы контролируем, откуда происходит первый вызов службы, мы знаем, что остальные службы будут следовать тем же правилам.
Таким образом, NSOperationQueue.currentQueue всегда будет возвращать одну из наших очередей или MainQueue.
dispatch_get_current_queue()
это устарело в iOS 6? в документах ничего об этом не сказано