Я пытаюсь реализовать очередь операций, и у меня есть следующий сценарий:
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 или 4 NSOperations
ожидания и выполнения while(!operacao.isFinished && !self.isCancelled){}
, мой код просто замирает, потому что NSOperation, который для меня важен, не выполняется, даже если он имеет более высокий приоритет.
Что я пробовал
-
Добавление зависимости во время выполнения, но поскольку мой NSOperation уже запущен, я не вижу никакого эффекта.
-
Вместо добавления операции в очередь я могу что-то сделать
[operation start]
. Он работает, но отмена текущей операции также отменяет другие операции, которые я начал? -
Я могу сделать что-то вроде
while(!operacao.isFinished && !self.isCancelled){[NSThread sleepForTimeInterval:0.001];}
. Это работает, но верно ли это? Может быть, есть лучшее решение.
В этой ситуации я могу гарантировать, что операция, которую я хочу, будет запущена, а остальные будут ждать в фоновом режиме? Каков правильный способ решить эту проблему?
Если кто-нибудь спросит меня, почему я не добавляю зависимость, прежде чем запускать свою очередь, потому что операция будет нужна другой, только если некоторые условия верны. Я буду знать, нужна ли мне другая операция только во время выполнения.
Спасибо за ваше время.