Параллелизм основных данных (NSOperation)

В документах Apple написано :

... вы должны создать контекст в основном (для последовательной очереди) или запустить (для параллельной очереди).

Но я действительно не понимаю, в чем разница. Почему я не могу создать контекст в main для параллельной очереди? Я попробовал это, и это работает абсолютно так же, как если бы я сделал это в start.

Есть еще одна вещь, которая меня смущает. Из документов для начать метод:

... Если вы реализуете параллельную операцию, вы должны переопределить этот метод и использовать его для запуска операции.

Итак, еще раз, почему я не могу инициализировать все в main (или, может быть, не должен инициализировать)?


person Community    schedule 11.03.2011    source источник


Ответы (2)


Может быть разница между тем, что вы называете «контекстом» и «одновременным», и тем, что Apple подразумевает под этими терминами. Они используют «одновременный» определенным (и запутанным) образом. Этот раздел из раздела Управление параллелизмом с помощью NSOperation может помочь:

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

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

person skue    schedule 11.03.2011
comment
Довольно глупо, как API для NSOperation написано с учетом этой терминологии. Я думаю, что большинство людей будет сбито с толку этим. - person Remover; 18.07.2012

Нет причин, по которым вы не можете создать контекст в main() для параллельной очереди, но, поскольку вам нужно управлять циклом выполнения в main, обычно лучше настроить такие вещи, как контекст в start(), если вы используете это техника.

person Kendall Helmstetter Gelner    schedule 11.03.2011