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];}
, Это работает, но это правильный путь? Может быть, есть лучшее решение.
В этой ситуации, как я могу гарантировать, что операция, которую я хочу, будет выполняться, а остальные будут ждать в фоновом режиме? Как правильно решить эту проблему?
Если кто-то спросит меня, почему я неДобавить зависимость перед запуском своей очереди, потому что другая операция понадобится, только если выполняются некоторые условия. Я буду знать, нужна ли мне другая операция только во время выполнения.
Спасибо за ваше время.