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