Si vous attendez (ou souhaitez) quelque chose qui correspond à ce comportement:
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>
Vous devez être conscient que si un certain nombre d'opérations "courtes" sont ajoutées à une file d'attente, vous pouvez voir ce comportement à la place (car les opérations sont démarrées dans le cadre de leur ajout à la file d'attente):
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>
Dans mon projet, j'avais besoin de savoir quand la dernière opération était terminée, après qu'un grand nombre d'opérations avaient été ajoutées à une série NSOperationQueue (c'est-à-dire maxConcurrentOperationCount = 1) et seulement quand elles étaient toutes terminées.
Googling J'ai trouvé cette déclaration d'un développeur Apple en réponse à la question "est un NSoperationQueue FIFO série?" -
Si toutes les opérations ont la même priorité (qui n'est pas modifiée après l'ajout de l'opération à une file d'attente) et que toutes les opérations sont toujours - isReady == OUI au moment où elles sont placées dans la file d'attente des opérations, alors une NSOperationQueue série est FIFO.
Chris Kane Cocoa Frameworks, Apple
Dans mon cas, il est possible de savoir quand la dernière opération a été ajoutée à la file d'attente. Donc, après l'ajout de la dernière opération, j'ajoute une autre opération à la file d'attente, de priorité inférieure, qui ne fait rien d'autre que d'envoyer la notification que la file d'attente a été vidée. Compte tenu de la déclaration d'Apple, cela garantit qu'un seul avis n'est envoyé qu'une fois toutes les opérations terminées.
Si les opérations sont ajoutées d'une manière qui ne permet pas de détecter la dernière, (c'est-à-dire non déterministe), je pense que vous devez suivre les approches KVO mentionnées ci-dessus, avec une logique de garde supplémentaire ajoutée pour essayer de détecter si davantage des opérations peuvent être ajoutées.
:)