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




swift multi thread (2)

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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





multithreading