Какие задачи больше подходят для NSOperation, чем GCD?

Какие задачи лучше подходят для использования NSOperation, а не GCD при программировании для iPhone?

Мне кажется, они делают одно и то же. Я не вижу сильных и слабых сторон одного над другим.


person dubbeat    schedule 03.12.2010    source источник


Ответы (4)


NSOperation построен поверх GCD, поэтому вопрос больше в том, используете ли вы NSOperation или передаете блок непосредственно в GCD.

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

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

Так что у каждого свои достоинства.

person Yuji    schedule 03.12.2010
comment
Будет ли справедливо сказать, что nsoperation хорошо подходит для операций, не критичных ко времени, таких как загрузка файла, а gcd хорошо подходит для критичных ко времени операций, таких как выполнение DSP для аудио? Не могли бы вы привести пример, когда вы использовали бы один над другим? - person dubbeat; 03.12.2010
comment
Я так не думаю. NSOperation определенно имеет немного больше накладных расходов, но это не делает GCD подходящим для операций, критичных ко времени. Опять же, NSOperation (в основной очереди) — это тонкий слой над НОД. Так что ваш вопрос не имеет смысла. Оба являются НОД. - person Yuji; 03.12.2010
comment
Тем не менее, как я писал выше, я сделаю NSOperation, если создам и запущу одну и ту же фоновую задачу в разных частях программы. Я просто буду использовать dispatch_async, если задача запускается только из одной части программы. - person Yuji; 03.12.2010
comment
Это помечено как iOS, поэтому.... NSOperationQueue НЕ построен поверх GCD (пока). см.: developer.apple.com/library/ios/#documentation/cocoa/reference/ Примечание. В iOS очереди операций не используют Grand Central Dispatch для выполнения операций. Они создают отдельные потоки для неконкурентных операций и запускают параллельные операции из текущего потока. Обсуждение разницы между одновременными и непараллельными операциями и способов их выполнения см. в разделе Справочник по классам NSOperation. - person levous; 20.04.2011
comment
Вау, ты совершенно прав. Я пришел из OS X и никогда внимательно не читал документацию NSOperationQueue с точки зрения iOS... Облом. - person Yuji; 20.04.2011
comment
В документе iOS для NSOperationQueue упоминается, что он не основан на GCD. - person Robert Mao; 29.07.2011
comment
@Robert: это указывалось уже в апреле, см. два комментария выше! Извините, что не обновил ответ в соответствии с комментариями ... - person Yuji; 29.07.2011
comment
на iOS4+ NSOperationQueue используйте GCD, см. Справочник по классам. - person malaba; 15.03.2012
comment
@malaba Это не всегда так. Из документов: 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, и они хороши, если вы добавляете много операций в различных точках своего кода и/или вам нужно управлять параллелизмом, приоритетами и зависимостями. По крайней мере, я так их использую.

person scaba    schedule 06.08.2011
comment
Я до сих пор не уверен, что это так. Прошло более 2 лет с момента этого ответа, и я все еще вижу это в документах 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
comment
@Answerbot Начиная с iOS 4 и OS X 10.6 это уже не так. Прочтите последние две части раздела «Обзор» developer.apple.com/library/ios/#documentation/Cocoa/Reference/ - person iwasrobbed; 22.04.2013

Как всегда с такими вопросами, используйте самый простой доступный API. Измерьте, является ли это проблемой производительности, а затем при необходимости повторите оценку.

person Mike Abdullah    schedule 03.12.2010
comment
Этот ответ был бы хорош, если бы вы сказали, какой из API самый простой. - person Akku; 04.07.2011
comment
Какой самый простой, скорее зависит от поставленной задачи - person Mike Abdullah; 07.07.2011
comment
В принципе, я хотел бы знать самый простой API обоих, если вы не рассматриваете задачу под рукой. Но чтобы обеспечить стандартный вариант использования, представьте, что у вас есть одна задача для фона, которую вы не хотите иметь в основном потоке. Он должен изменить вид, когда закончите. - person Akku; 07.07.2011
comment
Это звучит как отдельный вопрос. Предлагаю начать с чтения документации. - person Mike Abdullah; 11.07.2011

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

person Stuart    schedule 23.11.2011