Se você está esperando (ou deseja) algo que corresponda a este 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>
Você deve estar ciente de que, se várias operações "curtas" estiverem sendo adicionadas a uma fila, você poderá ver este comportamento (porque as operações são iniciadas como parte da adição à fila):
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>
Em meu projeto, eu precisava saber quando a última operação foi concluída, depois que um grande número de operações foi adicionado a um NSOperationQueue serial (ou seja, maxConcurrentOperationCount = 1) e somente quando todas foram concluídas.
Pesquisando no Google, encontrei esta declaração de um desenvolvedor da Apple em resposta à pergunta "is a serial NSoperationQueue FIFO?" -
Se todas as operações têm a mesma prioridade (que não é alterada depois que a operação é adicionada a uma fila) e todas as operações são sempre - isReady == YES no momento em que são colocadas na fila de operações, então um NSOperationQueue serial é FIFO.
Chris Kane Cocoa Frameworks, Apple
No meu caso é possível saber quando a última operação foi adicionada à fila. Então, depois que a última operação é adicionada, eu adiciono outra operação à fila, de menor prioridade, que não faz nada além de enviar a notificação de que a fila foi esvaziada. De acordo com a declaração da Apple, isso garante que apenas um único aviso seja enviado somente após a conclusão de todas as operações.
Se as operações estão sendo adicionadas de uma maneira que não permite detectar a última (ou seja, não determinística), então eu acho que você deve ir com as abordagens KVO mencionadas acima, com lógica de guarda adicional adicionada para tentar detectar se mais operações podem ser adicionadas.
:)