Почему я должен выбирать GCD вместо NSOperation и блоки для приложений высокого уровня? - PullRequest
31 голосов
/ 04 октября 2011

Справочник Apple Grand Central Dispatch гласит:

"... если ваше приложение должно работать на уровне Unix системы - например, если ему нужно манипулировать файловыми дескрипторами, портами Маха, сигналы или таймеры. GCD не ограничивается приложениями системного уровня, но перед тем, как использовать его для приложений более высокого уровня, следует подумать о том, будет ли аналогичная функциональность, предоставляемая в Какао (посредством NSOperation и блочных объектов), более простой в использовании или болеев соответствии с вашими потребностями. ".

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

На самом деле я не могу вспомнить ситуации для приложений высокого уровня, в которых использование GCD является обязательным и NSOperationможно / не следует использовать.

Есть мысли?

Ответы [ 5 ]

55 голосов
/ 05 октября 2011

Смысл здесь тот же, который Крис Хансон заявляет в своей статье " Когда использовать NSOperation vs. GCD ":

Простой ответ - это общее руководство для всех приложений развитие:

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

В данном конкретном случае это означает, что при написании Какао приложения, вы, как правило, должны использовать NSOperation, а не используя GCD напрямую. Не из-за разницы в эффективности, но потому что NSOperation обеспечивает абстракцию более высокого уровня на вершине механизмы ГКД.

В общем, я согласен с этим. NSOperation и NSOperationQueue обеспечивают поддержку зависимостей и одной или двух других вещей, которых нет у блоков и очередей GCD, и они абстрагируют детали более низкого уровня того, как реализуются параллельные операции. Если вам нужна эта функциональность, NSOperation - очень хороший способ.

Однако, после работы с обоими, я обнаружил, что заменяю весь мой код, основанный на NSOperation, на блоки и очереди GCD. Я сделал это по двум причинам: при использовании NSOperation для частых действий возникают значительные издержки, и я считаю, что мой код более понятен и более нагляден при использовании блоков GCD.

Первая причина возникла из-за профилирования в моих приложениях, когда я обнаружил, что процесс выделения и освобождения объекта NSOperation отнимает значительное количество ресурсов ЦП при работе с небольшими и частыми действиями, такими как отображение кадра OpenGL ES на экране. Блоки GCD полностью устранили эту нагрузку, что привело к значительному повышению производительности.

Вторая причина более субъективна, но я считаю, что мой код чище при использовании блоков, чем операции NSOperation. Быстрый захват области действия, допускаемый блоком, и их встроенная природа приводят к меньшему количеству кода, потому что вам не нужно создавать собственные подклассы NSOperation или связывать параметры для передачи в операцию, и, по моему мнению, более описательный код, потому что вы можете поместить код для запуска в очередь в том месте, где он запускается.

Опять же, это вопрос предпочтений, но я обнаружил, что использую GCD чаще, даже в более абстрактных приложениях Какао.

13 голосов
/ 09 января 2015
  • Предпочитать GCD, если задача не слишком сложна и требуется оптимальная производительность ЦП .
  • Предпочитать NSOperationQueue, если задача сложная и требует отмены или приостановки блока иуправление зависимостями .

GCD - это упрощенный способ представления единиц работы, которые будут выполняться одновременно.Вы не планируете эти единицы работы;система позаботится о планировании для вас.Добавление зависимости между блоками может быть головной болью.Отмена или приостановка блока создает дополнительную работу для вас как для разработчика!

NSOperation и NSOperationQueue добавляют немного дополнительных издержек по сравнению с GCD, но вы можете добавить зависимость между различными операциями.Вы можете повторно использовать, отменить или приостановить операции.NSOperation совместимо с Key-Value Observation (KVO);например, вы можете запустить NSOperation, слушая NSNotificationCenter.

Для подробного объяснения, обратитесь к этому вопросу: NSOperation vs Grand Central Dispatch

4 голосов
/ 04 октября 2011

Ну, NSOperation не имеет эквивалентов для dispatch_source_t, dispatch_io, dispatch_data_t, dispatch_semaphore_t и т. Д. Это также несколько выше издержек.

С другой стороны, libdispatch не имеет эквивалентов для зависимостей операций, приоритетов операций (приоритеты очереди несколько иные) или КВО по операциям.

1 голос
/ 16 января 2015

NSOperationQueue может сделать две вещи, которые GCD не может сделать: второстепенная - это зависимости (добавить операцию в очередь, но сказать ей, что она будет выполняться только после завершения некоторых других операций), а большая -NSOperation дает вам объект, который может получать сообщения во время выполнения задачи, в отличие от GCD, который имеет блоки, которые не могут получать сообщения, кроме как очень ограниченным образом.Вам либо нужны эти две функции, либо нет.Если вы этого не сделаете, то использование GCD намного проще в использовании.

Вот почему полезные примеры NSOperation всегда довольно сложны.Если бы они были просты, вы бы использовали вместо этого GCD.Обычно вы создаете подкласс NSOperation, который представляет собой значительный объем работы, или используете тот, который кто-то другой создал.

0 голосов
/ 04 октября 2011

Я на самом деле только что читал об этом, и, я уверен, это произойдет, как удивление, мнения расходятся.

Я не могу вспомнить случай, когда у вас было быиспользовать GCD поверх NSOperation, но это не означает, что такого случая не существует.Я, однако, согласен с общим мнением с точки зрения наилучшей практики кодирования:

Если у вас есть пара инструментов, которые подходят для работы (и в этом случае у вас есть NSOperation vs блок GCD),используйте класс с самым высоким уровнем абстракции (т. е. API самого высокого уровня).Мало того, что обычно легче использовать / меньше кода, вы также выиграете от потенциальных будущих улучшений, введенных в API более высокого уровня.

...