Si vous attendez (ou désirez) 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 savoir que si un certain nombre d'opérations "courtes" sont ajoutées à une file d'attente, vous pouvez voir ce comportement à la place (parce que les opérations sont lancées dans le cadre de l'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 s'était terminée, après qu'un grand nombre d'opérations aient été ajoutées à une NSOperationQueue en série (c'est-à-dire, maxConcurrentOperationCount=1) et seulement quand elles s'étaient toutes terminées.
En cherchant sur Google, j'ai trouvé cette déclaration d'un développeur Apple en réponse à la question "un NSoperationQueueue en série est-il FIFO ?" --
Si toutes les opérations ont la même priorité (qui n'est pas modifiée après l'opération est ajoutée à une file d'attente) et que toutes les opérations sont toujours - isReady==YES au moment où elles sont placées dans la file d'attente des opérations, alors une file d'attente NSOperationQueueue en série est FIFO. NSOperationQueueue 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. Ainsi, 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 qu'envoyer la notification que la file d'attente a été vidée. Compte tenu de la déclaration d'Apple, cela permet de s'assurer qu'une seule notification est envoyée, une fois que toutes les opérations ont été effectué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 adopter les approches KVO mentionnées ci-dessus, avec une logique de garde supplémentaire ajoutée pour essayer de détecter si d'autres opérations peuvent être ajoutées.
)