2013-05-10 8 views
5

У меня есть операция загрузки данных, которая должна быть отключена от основного потока, чтобы избежать возможных проблем с блокировкой. Для этого я использую NSOperationQueue и NSOperations.Как заблокировать NSOperation до завершения NSOperationQueue?

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

Проблема заключается в том, что, как только «основные» выходы, NSOperation будет помечен как «законченный», независимо от того, завершена ли очередь подсетей; как мне переопределить это поведение?

+0

Похоже, вы ищете [параллельное NSOperation] (http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html)? –

+0

@CarlVeazey Не ... точно, но похоже, что шаги, используемые для создания параллельного NSOperation, делают то же самое, что я на самом деле ищу. Вы должны переопределить, как обрабатываются методы запуска isFinished/isExecuting, и я думаю, что это именно то, что мне нужно сделать здесь. Мне нужно переопределить старт, чтобы он не устанавливал isFinished мгновенные главные концы. Что означает обращение с материалом KVO, когда я изменяю эти свойства, о, радость. – RonLugge

+0

@CodaFi Я не уверен, ясно ли я, но ответ, который вы предложили, не имеет смысла. Зависимости предотвращают выполнение операции, они не препятствуют ее завершению после ее начала. По крайней мере, это то, о чем говорят ссылки. – RonLugge

ответ

1

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

Лучшим решением было бы использовать систему зависимостей. Создайте еще одну операцию, которая зависит от вашей основной операции. После того, как вы создадите дочерние операции, добавьте их как зависимость от этой новой операции «отделки».

1

как только «основные» выходы, то NSOperation будет помечен как «законченный»,

Эта логика реализована в [NSOperation start], так что вы просто должны изменить его с помощью пользовательской логики : вызов main, который порождает некоторые дополнительные операции, которые после завершения задают состояние isFinished операции.

Смежные вопросы