NSInvocationOperation и NSOperationQueue параллелизм - PullRequest
3 голосов
/ 10 декабря 2011

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

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

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

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

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

[operationQueue addOperation:operation];

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

[ОБНОВЛЕНИЕ - в ответ на ответ Дани ниже.Взято из Apple link .

NSOperation и NSOperationQueue

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

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

1 Ответ

9 голосов
/ 10 декабря 2011

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

With synchronous objects:

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

With asynchronous objects:

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