NSOperationQueue и одновременный против не одновременных - PullRequest
16 голосов
/ 30 октября 2009

Я хочу настроить сериализованную очередь задач с помощью NSOperationQueue, но меня немного смущает терминология, обсуждаемая в документации.

В контексте NSOperation объект, условия одновременного и не совпадающий не обязательно обратитесь к параллельному исполнению потоки. Вместо этого операция выполняется с использованием среда, которая предусмотрена для это в то время как параллельная операция отвечает за настройку своего среда исполнения.

Что означает настройка «собственной среды выполнения»?

Мои производные задачи NSOperation должны выполняться последовательно в порядке их добавления в очередь.

Итак, я подумал, что это подразумевает «не параллельную» операцию, поэтому я реализовал бы «main» для работы, которую необходимо завершить, а также вернул NO для «isConcurrent». Кроме того, для 'setMaxConcurrentOperationCount' в NSOperationQueue будет установлено значение 1.

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

Верны ли эти предположения?

Ответы [ 2 ]

25 голосов
/ 30 октября 2009

NSOperationQueue всегда выполняет операции одновременно с учетом зависимостей.

Операция «не одновременно» требует отдельного потока для одновременного выполнения. NSOperationQueue отвечает за предоставление этой темы. Другими словами, непараллельная операция зависит от NSOperationQueue, чтобы сделать ее параллельной.

«Параллельная» операция является параллельной сама по себе; ему не нужно NSOperationQueue чтобы создать для него тему. Примером может служить операция, использующая асинхронный файловый ввод-вывод.

Если вы хотите, чтобы две или более операции выполнялись последовательно, вам нужно использовать зависимости.

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

Чтобы вручную установить максимум одновременных операций, используйте метод для операцииQueue setMaxConcurrentOperationCount:

1 голос
/ 30 октября 2009

Вам действительно нужно подкласс NSOperation? Почему бы просто не использовать NSInvocationOperation и его addDependency: метод?

Смотрите мой ответ в этом ТАКОМ вопросе .

...