I am trying to implement an operation queue and I have the following scenario:
NSOperation A
NSOperation B
NSOperation C
NSOperation D
NSOperationQueue queue
I start adding A
to queue
.
During the execution of A
I need to get some data from B
and I can't continue with A
until B
returns what I need.
The same situation will occur for B
depending on C
and for C
depending on D
.
To manage this, at each NSOperation
I have this code:
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];
}
My problem is that when I have something like 3 or 4 NSOperations
waiting and executing the while(!operacao.isFinished && !self.isCancelled){}
my code just freeze because the NSOperation that is important to me don't get executed, even if it have higher priority.
What I tried
Adding dependency during execution time but since my NSOperation is already running I doesn't seems to have any effect.
Instead of adding the operation to queue, I can do something
[operation start]
. It works, but canceling the current operation will also cancel the other operations that I started?I can do something like
while(!operacao.isFinished && !self.isCancelled){[NSThread sleepForTimeInterval:0.001];}
. It works, but is this the correct way? Maybe there is a better solution.
In this situation how I can guarantee that the operation that I want will run and the others will wait in background? What is the correct way to solve this?
If anyone question me why I don't add the dependency before starting my queue its because an operation will need the other only if some conditions are true. I will know if I need other operation only during execution time.
Thanks for your time.