Если вы ожидаете (или желаете) чего-то, что соответствует этому поведению:
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>
Вы должны знать, что если в очередь добавляется несколько «коротких» операций, вы можете вместо этого увидеть это поведение (поскольку операции запускаются как часть добавления в очередь):
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>
В моем проекте мне нужно было знать, когда завершилась последняя операция, после того, как большое количество операций было добавлено в серийный NSOperationQueue (т. Е. MaxConcurrentOperationCount = 1) и только тогда, когда все они были завершены.
Погуглил. Я нашел это заявление от разработчика Apple в ответ на вопрос "является ли серийный NSoperationQueue FIFO?" -
Если все операции имеют одинаковый приоритет (который не изменяется после добавления операции в очередь) и все операции всегда - isReady == YES к тому времени, когда они помещаются в очередь операций, то серийный NSOperationQueue равен FIFO.
Крис Кейн Какао Frameworks, Apple
В моем случае можно узнать, когда последняя операция была добавлена в очередь. Поэтому после добавления последней операции я добавляю в очередь еще одну операцию с более низким приоритетом, которая ничего не делает, кроме отправки уведомления о том, что очередь была очищена. Учитывая заявление Apple, это гарантирует, что только одно уведомление будет отправлено только после завершения всех операций.
Если операции добавляются таким образом, который не позволяет обнаружить последний (т.е. недетерминированный), то я думаю, вам следует использовать подходы KVO, упомянутые выше, с добавлением дополнительной логики защиты, чтобы попытаться определить, если еще операции могут быть добавлены.
:)