Se ti aspetti (o desideri) qualcosa che corrisponda a questo comportamento:
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>
È necessario essere consapevoli del fatto che se una serie di operazioni "brevi" vengono aggiunte a una coda, è possibile invece vedere questo comportamento (perché le operazioni vengono avviate come parte dell'aggiunta alla coda):
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>
Nel mio progetto avevo bisogno di sapere quando l'ultima operazione è stata completata, dopo che un gran numero di operazioni era stato aggiunto a un NSOperationQueue seriale (cioè, maxConcurrentOperationCount = 1) e solo quando erano state tutte completate.
Cercando su Google ho trovato questa affermazione di uno sviluppatore Apple in risposta alla domanda "is a serial NSoperationQueue FIFO?" -
Se tutte le operazioni hanno la stessa priorità (che non viene modificata dopo che l'operazione è stata aggiunta a una coda) e tutte le operazioni sono sempre - isReady == YES nel momento in cui vengono inserite nella coda delle operazioni, allora una NSOperationQueue seriale è FIFO.
Chris Kane Cocoa Frameworks, Apple
Nel mio caso è possibile sapere quando l'ultima operazione è stata aggiunta alla coda. Quindi, dopo che l'ultima operazione è stata aggiunta, aggiungo un'altra operazione alla coda, di priorità inferiore, che non fa altro che inviare la notifica che la coda è stata svuotata. Data la dichiarazione di Apple, ciò garantisce che venga inviato un solo avviso solo dopo che tutte le operazioni sono state completate.
Se le operazioni vengono aggiunte in un modo che non consente di rilevare l'ultima, (cioè, non deterministica), allora penso che tu debba andare con gli approcci KVO sopra menzionati, con una logica di guardia aggiuntiva aggiunta per provare a rilevare se ulteriormente possono essere aggiunte operazioni.
:)