Jeśli spodziewasz się (lub pragniesz) czegoś, co pasuje do tego zachowania:
t=0 add an operation to the queue. queueucount increments to 1
t=1 add an operation to the queue. queueucount increments to 2
t=2 add an operation to the queue. queueucount increments to 3
t=3 operation completes, queuecount decrements to 2
t=4 operation completes, queuecount decrements to 1
t=5 operation completes, queuecount decrements to 0
<your program gets notified that all operations are completed>
Należy mieć świadomość, że jeśli do kolejki dodaje się kilka „krótkich” operacji, można zamiast tego zobaczyć takie zachowanie (ponieważ operacje są uruchamiane jako część dodawania do kolejki):
t=0 add an operation to the queue. queuecount == 1
t=1 operation completes, queuecount decrements to 0
<your program gets notified that all operations are completed>
t=2 add an operation to the queue. queuecount == 1
t=3 operation completes, queuecount decrements to 0
<your program gets notified that all operations are completed>
t=4 add an operation to the queue. queuecount == 1
t=5 operation completes, queuecount decrements to 0
<your program gets notified that all operations are completed>
W moim projekcie musiałem wiedzieć, kiedy zakończyła się ostatnia operacja, po dodaniu dużej liczby operacji do szeregowego NSOperationQueue (tj. MaxConcurrentOperationCount = 1) i tylko wtedy, gdy wszystkie zostały zakończone.
Googling Znalazłem to oświadczenie od programisty Apple w odpowiedzi na pytanie „czy serial NSoperationQueue FIFO?” -
Jeśli wszystkie operacje mają ten sam priorytet (który nie jest zmieniany po dodaniu operacji do kolejki) i wszystkie operacje są zawsze - isReady == TAK do czasu ich umieszczenia w kolejce operacji, wówczas szeregową kolejką NSOperationQueue jest FIFO.
Chris Kane Cocoa Frameworks, Apple
W moim przypadku można wiedzieć, kiedy ostatnia operacja została dodana do kolejki. Więc po dodaniu ostatniej operacji dodaję do kolejki kolejną operację o niższym priorytecie, która nic nie robi poza wysłaniem powiadomienia, że kolejka została opróżniona. Biorąc pod uwagę oświadczenie Apple, zapewnia to, że tylko jedno powiadomienie zostanie wysłane dopiero po zakończeniu wszystkich operacji.
Jeśli operacje są dodawane w sposób, który nie pozwala na wykrycie ostatniego (tj. Niedeterministyczny), to myślę, że musisz iść z podejściami KVO wspomnianymi powyżej, z dodatkową logiką ochronną, aby spróbować wykryć, czy dalej operacje mogą zostać dodane.
:)