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

(iOS) dispatch_async() против NSOperationQueue

Я изучил программирование iOS благодаря курсу Stanford CS193p (на iTunes U), а также книгу программирования iOS от Big Nerd Ranch. В обоих случаях рекомендуется использовать dispatch_async(), dispatch_get_main_queue() и т.д. Для обработки потоков и параллельных операций. Однако на сессии WWDC 2012 по созданию параллельного пользовательского интерфейса докладчик рекомендовал использовать NSOperationQueue.

В чем разница между dispatch_*() и NSOperationQueue, и есть ли какая-либо причина (техническая, производительность, стилистика или иное), которые я должен использовать один над другим? Является ли NSOperationQueue оболочкой Objective-C вокруг dispatch_async, или есть ли больше, чем это?

4b9b3361

Ответ 1

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

Правило большого пальца: Сначала используйте api самого высокого уровня, а затем деградируйте на основе того, что вам нужно выполнить.

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

Что касается вопроса, я рекомендую обратиться к следующим ресурсам:

Теперь, касаясь ваших конкретных вопросов:

В чем разница между отправкой _ *() и NSOperationQueue, [...]

См. выше.

[...] и есть ли какая-либо причина (техническая, производительность, стилистика или иное), что я должен использовать один над другим?

Если материал NSOperation выполняет вашу работу, используйте его.

Является ли NSOperationQueue только оболочкой Objective-C вокруг dispatch_async, или есть ли что-то еще для этого?

Да, это в основном. Плюс такие функции, как операционные зависимости, простой запуск/остановка.

Изменение

Говорят, что использование самого высокого уровня api может показаться интригующим. Конечно, если вам нужен быстрый способ запускать код в определенном потоке, вы не хотите писать много шаблонов кода, что делает использование функций более низкого уровня C совершенно допустимым:

dispatch_async(dispatch_get_main_queue(), ^{
  do_something();
});

Но рассмотрим это:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
  do_something();
}];

Я бы порекомендовал последнее, потому что большинство из того, что вы напишете, Objective-C, так почему бы не принять его выразительность?

Ответ 2

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

NSOperationQueue имеет дополнительные возможности, не предоставляемые GCD, но если вам это не нужны, использование GCD даст вам лучшую производительность.

Ответ 3

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

Ответ 4

Добавляя к ответу выше, другое преимущество очереди NSOperation над GCD:

1) Зависимости:. Мы можем настроить зависимость между двумя NSOperations операция не начнется, пока все ее зависимости не вернутся к завершению.

2) Состояние операции:. Мы можем контролировать состояние операции или очереди операций. Готово, выполняется или завершено

3) Максимальное количество операций: - Мы можем указать максимальное количество операций в очереди, которые могут выполняться одновременно