В соответствии с моим ответом на связанный вопрос , я собираюсь не согласиться с BJ и предложить вам сначала взглянуть на GCD через NSOperation / NSOperationQueue, если последний не предоставляет то, что вам нужно, а GCD - нет.
До GCD я использовал много NSOperations / NSOperationQueues в своих приложениях для управления параллелизмом. Однако, так как я начал использовать GCD на регулярной основе, я почти полностью заменил NSOperations и NSOperationQueues на блоки и очереди отправки. Это произошло из-за того, что я использовал обе технологии на практике, и из профилирования, которое я использовал для них.
Во-первых, при использовании NSOperations и NSOperationQueues нетривиальные издержки. Это объекты Какао, и они должны быть выделены и освобождены. В написанном мною приложении iOS, которое визуализирует трехмерную сцену со скоростью 60 кадров в секунду, я использовал NSOperations для инкапсуляции каждого визуализированного кадра. Когда я рассказывал об этом, создание и разборка этих NSOperations составляли значительную часть циклов ЦП в работающем приложении и замедляли работу. Я заменил их простыми блоками и последовательной очередью GCD, и эти издержки исчезли, что привело к заметно лучшей производительности рендеринга. Это было не единственное место, где я заметил накладные расходы от использования NSOperations, и я видел это как на Mac, так и на iOS.
Во-вторых, существует элегантность для блочного кода отправки, который трудно сопоставить при использовании NSOperations. Это так невероятно удобно, чтобы обернуть несколько строк кода в блок и отправить его для выполнения в последовательную или параллельную очередь, где для создания настраиваемой NSOperation или NSInvocationOperation для этого требуется гораздо больше вспомогательного кода. Я знаю, что вы можете использовать NSBlockOperation, но вы можете отправлять что-то в GCD. Заключение этого кода в блоки в соответствии с соответствующей обработкой в вашем приложении, на мой взгляд, приводит к лучшей организации кода, чем использование отдельных методов или пользовательских операций NSO, которые инкапсулируют эти задачи.
NSOperations и NSOperationQueues по-прежнему имеют очень хорошее применение. GCD не имеет реальной концепции зависимостей, где NSOperationQueues может создавать довольно сложные графы зависимостей. Я использую NSOperationQueues для этого в нескольких случаях.
В целом, хотя я обычно выступаю за использование самого высокого уровня абстракции, который выполняет задачу, это один из случаев, когда я спорю о низкоуровневом API GCD. Среди разработчиков iOS и Mac, с которыми я говорил об этом, подавляющее большинство предпочитают использовать GCD поверх NSOperations, если они не нацелены на версии ОС без поддержки этого (те, что до iOS 4.0 и Snow Leopard).