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

NSOperationQueue и одновременные и неконкурентные

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

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

Что значит настроить "собственную среду исполнения"?

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

Поэтому я подумал, что это подразумевает "неконкурентную" операцию, поэтому я бы выполнил "основную" для работы, которая должна быть завершена, а также вернуть НЕТ для "isConcurrent". Кроме того, NSOperationQueue 'setMaxConcurrentOperationCount' будет установлен в 1.

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

Правильны ли эти предположения?

4b9b3361

Ответ 1

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

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

Операция "параллельная" параллельна сама по себе; для создания потока для него не требуется NSOperationQueue. Примером может служить операция, в которой используется асинхронный файл IO.

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

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

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

Ответ 2

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

См. мой ответ в этот вопрос SO.