NSOperation - zmuszanie operacji do dynamicznego oczekiwania innych

Usiłuję zaimplementować kolejkę operacji i mam następujący scenariusz:

NSOperation A
NSOperation B
NSOperation C
NSOperation D
NSOperationQueue queue

Zaczynam dodawaćA doqueue.

Podczas wykonywaniaA Muszę uzyskać trochę danychB i nie mogę kontynuowaćA aż doB zwraca to, czego potrzebuję.

Ta sama sytuacja będzie miała miejsce dlaB zależy odC i dlaC zależy odD.

Aby to zarządzać, w każdymNSOperation Mam ten kod:

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];          
}

Mój problem polega na tym, że mam coś takiego jak 3 lub 4NSOperations czekanie i wykonywaniewhile(!operacao.isFinished && !self.isCancelled){} mój kod po prostu zamarza, ponieważ ważna dla mnie NSOperacja nie zostaje wykonana, nawet jeśli ma wyższy priorytet.

Co próbowałem

Dodanie zależności w czasie wykonywania, ale ponieważ moja NSOperacja już działa, wydaje się, że nie ma żadnego efektu.

Zamiast dodawać operację do kolejki, mogę coś zrobić[operation start]. Działa, ale anulowanie bieżącej operacji spowoduje również anulowanie innych operacji, które uruchomiłem?

Mogę zrobić coś takiegowhile(!operacao.isFinished && !self.isCancelled){[NSThread sleepForTimeInterval:0.001];}. To działa, ale czy to jest właściwy sposób? Może jest lepsze rozwiązanie.

W tej sytuacji, jak mogę zagwarantować, że operacja, którą chcę, zostanie uruchomiona, a inni będą czekać w tle? Jaki jest właściwy sposób rozwiązania tego problemu?

Jeśli ktoś zapyta mnie, dlaczego nie dodam zależności przed rozpoczęciem kolejki, to dlatego, że operacja będzie potrzebować drugiej tylko wtedy, gdy pewne warunki są prawdziwe. Będę wiedział, czy potrzebuję innej operacji tylko w czasie wykonywania.

Dziękuję za Twój czas.

questionAnswers(7)

yourAnswerToTheQuestion