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.