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.

Respuestas a la pregunta(7)

Su respuesta a la pregunta