NSOperation - заставлять операцию динамически ждать других

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

NSOperation A
NSOperation B
NSOperation C
NSOperation D
NSOperationQueue queue

Я начинаю добавлятьA кqueue

Во время исполненияA Мне нужно получить некоторые данные изB и я могу'продолжитьA до тех порB возвращает то, что мне нужно.

Такая же ситуация произойдет дляB в зависимости отC и дляC в зависимости от .D

Чтобы справиться с этим, на каждомNSOperation У меня есть этот код:

NSOperation *operation; //This can be A, B, C, D or any other NSOperation

[self setQueuePriority:NSOperationQueuePriorityVeryLow]; //Set the current NSOperation with low priority

[queue addOperation: operation]; //Add the operation that I want to the queue

while(!operation.isFinished && !self.isCancelled){} //I need to wait the operation that I depend before moving on with the current operation

[self setQueuePriority:NSOperationQueuePriorityNormal]; //After the while, the other operation finished so I return my priority to normal and continue

if(self.isCancelled){ //If I get out of the while because the current operation was cancelled I also cancel the other operation.
[operation cancel];          
}

Моя проблема в том, что когда у меня есть что-то вроде 3 или 4NSOperations ожидание и выполнениеwhile(!operacao.isFinished && !self.isCancelled){} мой код просто зависает, потому что операция NSO, которая важна для меня, невыполняется, даже если он имеет более высокий приоритет.

Что я пробовал

Добавление зависимости во время выполнения, но так как моя NSOperation уже работает, я неКажется, это не имеет никакого эффекта.

Вместо добавления операции в очередь, я могу сделать что-то[operation start], Это работает, но отмена текущей операции также отменит другие операции, которые я начал?

Я могу сделать что-то вродеwhile(!operacao.isFinished && !self.isCancelled){[NSThread sleepForTimeInterval:0.001];}, Это работает, но это правильный путь? Может быть, есть лучшее решение.

В этой ситуации, как я могу гарантировать, что операция, которую я хочу, будет выполняться, а остальные будут ждать в фоновом режиме? Как правильно решить эту проблему?

Если кто-то спросит меня, почему я неДобавить зависимость перед запуском своей очереди, потому что другая операция понадобится, только если выполняются некоторые условия. Я буду знать, нужна ли мне другая операция только во время выполнения.

Спасибо за ваше время.

Ответы на вопрос(7)

Ваш ответ на вопрос