NSOperation - Forzar una operación para esperar a otros dinámicamente
Estoy tratando de implementar una cola de operaciones y tengo el siguiente escenario:
NSOperation A
NSOperation B
NSOperation C
NSOperation D
NSOperationQueue queue
Empiezo a añadirA
aqueue
.
Durante la ejecución deA
Necesito obtener algunos datos deB
y no puedo continuar conA
hastaB
devuelve lo que necesito.
La misma situación ocurrirá paraB
Dependiendo deC
y paraC
Dependiendo deD
.
Para gestionar esto, en cadaNSOperation
Tengo este codigo
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];
}
Mi problema es que cuando tengo algo como 3 o 4NSOperations
esperando y ejecutando elwhile(!operacao.isFinished && !self.isCancelled){}
mi código se congela porque la NSOperation que es importante para mí no se ejecuta, incluso si tiene una prioridad más alta.
Lo que intenté
Agregando dependencia durante el tiempo de ejecución, pero como mi NSOperation ya se está ejecutando, no parece tener ningún efecto.
En lugar de agregar la operación a la cola, puedo hacer algo[operation start]
. Funciona, pero cancelar la operación actual también cancelará las otras operaciones que inicié.
Puedo hacer algo comowhile(!operacao.isFinished && !self.isCancelled){[NSThread sleepForTimeInterval:0.001];}
. Funciona, pero ¿es esta la manera correcta? Tal vez haya una mejor solución.
En esta situación, ¿cómo puedo garantizar que la operación que deseo se ejecute y las demás esperarán en segundo plano? ¿Cuál es la forma correcta de resolver esto?
Si alguien me pregunta por qué no agrego la dependencia antes de comenzar mi cola, es porque una operación necesitará la otra solo si se cumplen algunas condiciones. Sabré si necesito otra operación solo durante el tiempo de ejecución.
Gracias por tu tiempo.