Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Итак, у каждого есть свои достоинства.

Ответ 2

По-видимому, NSOperationQueue построен на GCD с iOS 4; документы просто не обновлялись. Проверьте эту публикацию от сотрудника Apple здесь: https://devforums.apple.com/message/352770 (Возможно, вам потребуется создать учетную запись). Итак, вы должны следовать совету Майка Абдуллы и использовать простейший API для задача под рукой. dispatch_async - это более низкий уровень, обычно тип C-типа (но не ограничиваясь этим), и хорош для сделок с одним выстрелом и последовательным типом (запустите этот блок в этой очереди, FTW). NSOperationQueues представляют собой более высокий уровень, Objective-C, и хороши, если вы добавляете много операций в разных точках вашего кода и/или должны управлять concurrency, приоритетами и зависимостями. По крайней мере, как я их использую.

Ответ 3

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

Ответ 4

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