Si espera (o desea) algo que coincida con este comportamiento:
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>
Debe tener en cuenta que si se agregan varias operaciones "cortas" a una cola, es posible que vea este comportamiento en su lugar (porque las operaciones se inician como parte de su adición a la cola):
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>
En mi proyecto, necesitaba saber cuándo se completó la última operación, después de que se hubiera agregado una gran cantidad de operaciones a una NSOperationQueue en serie (es decir, maxConcurrentOperationCount = 1) y solo cuando se habían completado todas.
Buscando en Google encontré esta declaración de un desarrollador de Apple en respuesta a la pregunta "¿es una serie FIFO NSoperationQueue?" -
Si todas las operaciones tienen la misma prioridad (que no se cambia después de que la operación se agrega a una cola) y todas las operaciones están siempre - isReady == YES para cuando se colocan en la cola de operaciones, entonces una NSOperationQueue serial es FIFO.
Chris Kane Cocoa Frameworks, Apple
En mi caso es posible saber cuándo se agregó la última operación a la cola. Entonces, después de agregar la última operación, agrego otra operación a la cola, de menor prioridad, que no hace más que enviar la notificación de que la cola se ha vaciado. Dada la declaración de Apple, esto garantiza que solo se envíe un aviso único después de que se hayan completado todas las operaciones.
Si las operaciones se están agregando de una manera que no permite detectar la última (es decir, no determinista), entonces creo que debe seguir los enfoques de KVO mencionados anteriormente, con una lógica de protección adicional agregada para tratar de detectar si más se pueden agregar operaciones.
:)