Відповідно до моєї відповіді на відповідне запитання , я не погоджуюся з 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 тоді. Обертання цього коду блоками, що відповідає їхній обробці у вашій програмі, на мою думку, призводить до кращої організації коду, ніж до використання окремих методів або спеціальних NSOperations, які інкапсулюють ці завдання.
NSOperations та NSOperationQueues все ще мають дуже гарне використання. GCD не має реальної концепції залежності, де NSOperationQueues може встановлювати досить складні графіки залежності. Для цього я використовую NSOperationQueues у кількох випадках.
Загалом, хоча я зазвичай виступаю за використання найвищого рівня абстракції, що виконує завдання, це один випадок, коли я аргументую API нижчого рівня GCD. Серед розробників iOS та Mac, з якими я говорив, переважна більшість бажає використовувати GCD через NSOperations, якщо вони не орієнтуються на версії ОС без підтримки для неї (ті, що перебувають перед iOS 4.0 та Snow Leopard).