Wenn Sie etwas erwarten (oder wünschen), das diesem Verhalten entspricht:
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>
Sie sollten sich bewusst sein, dass beim Hinzufügen mehrerer "kurzer" Vorgänge zu einer Warteschlange möglicherweise stattdessen dieses Verhalten angezeigt wird (da Vorgänge als Teil des Hinzufügens zur Warteschlange gestartet werden):
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>
In meinem Projekt musste ich wissen, wann der letzte Vorgang abgeschlossen war, nachdem eine große Anzahl von Vorgängen zu einer seriellen NSOperationQueue hinzugefügt wurde (dh maxConcurrentOperationCount = 1) und erst, wenn alle abgeschlossen waren.
Googeln Ich habe diese Aussage eines Apple-Entwicklers als Antwort auf die Frage "Ist ein serielles NSoperationQueue-FIFO?" Gefunden. - -
Wenn alle Operationen dieselbe Priorität haben (die nicht geändert wird, nachdem die Operation zu einer Warteschlange hinzugefügt wurde) und alle Operationen immer - isReady == YES sind, wenn sie in die Operationswarteschlange gestellt werden, ist eine serielle NSOperationQueue FIFO.
Chris Kane Cocoa Frameworks, Apple
In meinem Fall ist es möglich zu wissen, wann der letzte Vorgang zur Warteschlange hinzugefügt wurde. Nachdem der letzte Vorgang hinzugefügt wurde, füge ich der Warteschlange einen weiteren Vorgang mit niedrigerer Priorität hinzu, der lediglich die Benachrichtigung sendet, dass die Warteschlange geleert wurde. Aufgrund der Aussage von Apple wird so sichergestellt, dass nur eine einzige Benachrichtigung gesendet wird, nachdem alle Vorgänge abgeschlossen wurden.
Wenn Operationen auf eine Weise hinzugefügt werden, die es nicht erlaubt, die letzte zu erkennen (dh nicht deterministisch), dann müssen Sie meiner Meinung nach mit den oben genannten KVO-Ansätzen fortfahren und zusätzliche Schutzlogik hinzufügen, um zu versuchen, weitere zu erkennen Operationen können hinzugefügt werden.
:) :)