Какие задачи лучше подходят для использования NSOperation
, а не GCD
при программировании для iPhone?
Мне кажется, они делают одно и то же. Я не вижу сильных и слабых сторон одного над другим.
Какие задачи лучше подходят для использования NSOperation
, а не GCD
при программировании для iPhone?
Мне кажется, они делают одно и то же. Я не вижу сильных и слабых сторон одного над другим.
NSOperation
построен поверх GCD, поэтому вопрос больше в том, используете ли вы NSOperation
или передаете блок непосредственно в GCD.
NSOperation
громоздкий и требует больше стандартных кодов для его настройки, но у него гораздо больше функциональных возможностей. Вы можете создать один и тот же подкласс NSOperation
в различных частях вашего кода, поместить их в очередь и запустить.
Передача блока в GCD, например. dispatch_async
быстрый и одноразовый. Обычно вы не используете блок повторно где-либо еще; вы просто устанавливаете блок, который выполняется только в этой точке кода, передаете его GCD или другим API и быстро продолжаете.
Так что у каждого свои достоинства.
NSOperation
определенно имеет немного больше накладных расходов, но это не делает GCD подходящим для операций, критичных ко времени. Опять же, NSOperation
(в основной очереди) — это тонкий слой над НОД. Так что ваш вопрос не имеет смысла. Оба являются НОД.
- person Yuji; 03.12.2010
NSOperation
, если создам и запущу одну и ту же фоновую задачу в разных частях программы. Я просто буду использовать dispatch_async
, если задача запускается только из одной части программы.
- person Yuji; 03.12.2010
NSOperationQueue
с точки зрения iOS... Облом.
- person Yuji; 20.04.2011
NSOperationQueue
используйте GCD, см. Справочник по классам.
- person malaba; 15.03.2012
An operation queue executes its operations either directly, by running them on secondary threads, **or** indirectly using the libdispatch library (also known as Grand Central Dispatch)
- person memmons; 22.02.2013
По-видимому, NSOperationQueue построен на GCD с iOS 4; документы просто не обновлялись. Проверьте это сообщение сотрудника Apple здесь: https://devforums.apple.com/message/352770 (вам может понадобиться для создания учетной записи) Итак, вы должны следовать совету Майка Абдуллы и использовать самый простой API для поставленной задачи. dispatch_async — это более низкий уровень, обычно это материал C-типа (но не ограничивается им), и он хорош для одноразовых и последовательных сделок (запустите этот блок в этой очереди, FTW). NSOperationQueues - это более высокий уровень, объект Objective-C, и они хороши, если вы добавляете много операций в различных точках своего кода и/или вам нужно управлять параллелизмом, приоритетами и зависимостями. По крайней мере, я так их использую.
NSOperations
: An operation queue executes its operations either directly, by running them on secondary threads, **or** indirectly using the libdispatch library (also known as Grand Central Dispatch).
- person memmons; 22.02.2013
Как всегда с такими вопросами, используйте самый простой доступный API. Измерьте, является ли это проблемой производительности, а затем при необходимости повторите оценку.
Я не думаю, что здесь упоминалась одна вещь: NSOperation
могут быть отменены во время выполнения, в то время как блок гарантированно завершится после начала выполнения. При этом очередь GCD может быть приостановлена (dispatch_suspend()
), так что любые блоки, следующие за выполняющимися в данный момент блоками, не будут выполняться.