Добавление NSOperationQueue к NSOperation

Безопасно ли добавлять NSOperationQueue в NSOperation, а затем добавить эту операцию в другую NSOperationQueue?

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

NSOperationQueue *mainQueue = [NSOperationQueue alloc] init];

// Here I declare some NSBlockOperation's, i.e. parseOperation1-2-3
// and also another operation called zipOperation, which includes
// an NSOperationQueue itself. This queue takes the processed (parsed) files
// and write them to a single zip file. Each operation's job is to write the data
// stream and add it to the zip file. After all operations are done,
// it closes the zip.

[zipOperation addDependency:parseOperation1];
[zipOperation addDependency:parseOperation2];
[zipOperation addDependency:parseOperation3];

[mainQueue addOperation:parseOperation1];
[mainQueue addOperation:parseOperation2];
[mainQueue addOperation:parseOperation3];
[mainQueue addOperation:zipOperation];

1 ответ

Решение

Я использовал этот подход, и он запущен в реальном коде, развернутом в App Store. Я не испытывал никаких проблем во время разработки или в течение последних 2 месяцев с момента появления кода.

В моем случае у меня был ряд операций высокого уровня, некоторые из которых содержали набор подопераций. Вместо того чтобы раскрывать детали каждой подоперации в коде высокого уровня, я создал NSOperations которые сами содержали NSOperationQueues и поставил в очередь свои собственные подоперации. Код, которым я закончил, был намного чище и проще в обслуживании.

Я много читал в NSOperation и не видел ни одного комментария, который предостерегает против такого подхода. Я просмотрел много информации в Интернете, документацию Apple и видеоролики WWDC.

Единственным возможным "недостатком" может быть сложность понимания и реализации Concurrent операция. Встраивание NSOperationQueue в NSOperation означает, что операция становится Concurrent,

Так что это "ДА" от меня.


Дополнительные сведения о параллельных операциях:

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

Если работа не будет закончена ко времени start вызов возвращается, затем вы настраиваете NSOperation как Concurrent операция, поэтому NSOperationQueue знает, что он должен ждать, пока вы не скажете ему, что операция завершена в какой-то более поздний момент времени.

Например, параллельные операции часто используются для выполнения асинхронных сетевых вызовов; метод start только запускает сетевой вызов, который затем выполняется в фоновом режиме, и вызывает операцию обратно после ее завершения. Затем вы меняете isFinished собственность NSOperation отметить, что работа завершена.

Итак.... Обычно, когда вы добавляете операции к NSOperationQueue эта очередь выполняет эти операции в фоновом режиме. Так что если вы положите NSOperationQueue внутри NSOperation тогда эта работа будет выполняться в фоновом режиме. Поэтому операция concurrent и вам нужно пометить, когда внутренний NSOperationQueue завершил обработку всех своих операций.

В качестве альтернативы есть несколько методов NSOperationQueue такие как waitUntilAllOperationsAreFinished который может быть использован для обеспечения всей работы до start возврат вызовов, однако это связано с блокировкой потоков, и я избегал их, вы можете чувствовать себя более комфортно при таком подходе, и убедитесь, что у вас нет побочных эффектов от блокировки потоков.

В моем случае я уже был знаком с Concurrent операции, так что это было просто, чтобы настроить его как Concurrent операция.

Некоторая документация о параллельных операциях:

Руководство по программированию параллелизма: настройка операций для параллельного выполнения

В этом примере они отсоединяют поток для выполнения работы в фоновом режиме, в нашем случае мы запускаем NSOperationQueue Вот.

Другие вопросы по тегам