Параллелизм NSInvocationOperation и NSOperationQueue

Я использую NSInvocationOperation с NSOperationQueue разработкой в ​​iOS5. Согласно документации Apple по объектам вызова:

Класс NSInvocationOperation является конкретным подклассом NSOperation ... Этот класс реализует непараллельную операцию.

Итак, мой объект NSInvocationOperation выполняется синхронно? (поправьте меня здесь) В документации Apple также говорится об объектах очереди операций:

В iOS очереди операций не используют Grand Central Dispatch для выполнения операций. Они создают отдельные потоки для непараллельных операций и запускают параллельные операции из текущего потока.

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

[operationQueue addOperation:operation];

Итак, мой вопрос: 1) Поскольку очередь операций будет порождать отдельный поток для выполнения NSInvocationObject, как сказано в документации, будет ли он выполняться асинхронно, а не синхронно?

[ОБНОВЛЕНИЕ - в ответ на ответ Дэни ниже. Взято из ссылки Apple.

NSOperation и NSOperationQueue

Существует несколько различных способов использования NSOperation, но наиболее распространенным является создание собственного подкласса и переопределение одного метода: main. Основной метод вызывается для выполнения операции, когда NSOperationQueue планирует ее запуск. Классы NSOperation, написанные таким образом, известны как непараллельные операции, потому что разработчик не несет ответственности за порождение потоков - многопоточность обрабатывается суперклассом. (Пусть вас не смущает терминология: то, что операция не является параллельной, не означает, что она не может выполняться одновременно, это просто означает, что вам не нужно обрабатывать параллелизм самостоятельно.)

Если вам нужен больший контроль над потоками и средой выполнения ваших операций, вы можете использовать параллельные операции. Для этого вы создаете подкласс NSOperation и переопределяете метод запуска. В методе запуска вы можете создавать потоки и настраивать среду перед вызовом основного метода. Вы также должны поддерживать состояние NSOperation, задавая такие свойства, как isExecuting и isFinished. Короче говоря, параллельные операции дают вам гораздо больший контроль, но также требуют больше усилий - для большинства задач одновременных операций достаточно.


person Just a coder    schedule 10.12.2011    source источник
comment
Concurrent в смысле флага isConcurrent в NSOperations - это любопытный и несколько вводящий в заблуждение термин. Он используется последовательно и имеет неопределенный смысл в контексте, но может не означать того, чего вы ожидаете.   -  person Catfish_Man    schedule 10.12.2011


Ответы (1)


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

With synchronous objects:

Creating thread
    |
    |\
    | \______
    |        |
    |       Operation A
    |        |
    |       Operation B
    |        |
    |        |

With asynchronous objects:

Creating thread
    |
    |\
    | \___________________
    |                     |
    |\                  Operation A
    | \______             |
    |        |            |
    |       Operation B   |
    |        |            |
    |        |            |
person Dani    schedule 10.12.2011
comment
Спасибо чувак. Похоже, что диаграммы ascii сделали его намного проще, чем подробные документы ^^, - person Just a coder; 10.12.2011
comment
нужно одно небольшое пояснение к вашей диаграмме. Добавление синхронного объекта NSInvocationOperation в NSOperationQueue заставляет его функционировать как первая диаграмма? И если это так, будет ли это работать как последовательная очередь? - person Just a coder; 18.12.2011