Перед НОД, я использовал много NSOperations/NSOperationQueues в моих приложений для управления параллелизмом. Однако, поскольку я начал регулярно использовать GCD, я почти полностью заменил NSOperations и NSOperationQueues блоками и очередями отправки. Это произошло с , как я использовал обе технологии на практике, и из профилирования , которые я выполнил на них.
Во-первых, при использовании NSOperations и NSOperationQueues существует нетривиальное количество накладных расходов. Это объекты какао, и их необходимо выделить и освободить. В приложении iOS, которое I написало, которое отображает трехмерную сцену при 60 FPS, я использовал NSOperations для , инкапсулируя каждый визуализированный кадр. Когда я профилировал это, создание и удаление этих NSOperations составляли значительную часть циклов CPU в запущенном приложении и замедляли вещи вниз. Я заменил их простыми блоками и очередью GCD serial , и эти служебные данные исчезли, что привело к значительному повышению производительности рендеринга . Это было не единственное место, где я заметил накладные расходы с использованием NSOperations, и я видел это как на Mac, так и на iOS.
Во-вторых, есть изящество к блочному методу отправки, который является трудным , чтобы соответствовать при использовании NSOperations. Это невероятно удобно для обернуть несколько строк кода в блоке и отправить его на в последовательную или параллельную очередь, где для создания пользовательского NSOperation или для NSInvocationOperation для этого требуется гораздо больше кода поддержки. Я знаю, что вы можете использовать NSBlockOperation, но вы также можете отправить на GCD. Обертка этого кода в блоках inline с соответствующей обработкой в вашем приложении приводит, на мой взгляд, к лучшей организации кода, чем к отдельным методам или пользовательским NSOperations, которые инкапсулируют эти задачи.
NSOperations и NSOperationQueues по-прежнему имеют очень хорошее применение. GCD имеет никакой реальной концепции зависимостей, где NSOperationQueues может настроить довольно сложные графики зависимостей . Я использую NSOperationQueues для этого в нескольких случаях.
В целом, хотя я обычно выступаю за использование наивысшего уровня абстракции, которая выполняет задачу, это один случай, когда я утверждаю для более низкого уровня API GCD. Среди разработчиков iOS и Mac, о которых я говорил , большинство из них предпочитают использовать GCD более NSOperations, если они не нацелены на версии ОС без поддержки (до IOS 4.0 и Snow Leopard).
В вашем случае я бы использовал GCD. NSOperation имеет некоторые функции: их можно отменить и иметь зависимости. GCD можно использовать для работы с файлами и блоками памяти. Вам нужно принять решение по задаче, которую вы пытаетесь решить. –
@ Cy-4AH спасибо за ваш ответ, я буду помнить об этом. Да, я прекрасно понимаю, что NSOperation предлагает более высокий уровень абстракции при работе с потоками и имеет хорошие функции (у которых GCD нет), как отмена операций из очереди. Но меня интересовали те два примера, которые выполняют одну и ту же задачу или нет? – Whirlwind
NSOperation - это объект какао вместо GCD. Используйте NSOperation только тогда, когда вы не можете делать то, что хотите, с GCD – thedjnivek