Если вы ожидаете (или хотите) что-то, что соответствует этому поведению:
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 == ДА к тому времени, когда они помещаются в очередь операций, затем последовательный
NSOperationQueue - это FIFO.
Крис Кейн
Каркасы какао, яблоко
В моем случае можно узнать, когда в очередь была добавлена последняя операция. Поэтому после добавления последней операции я добавляю в очередь еще одну операцию с более низким приоритетом, которая не делает ничего, кроме отправки уведомления о том, что очередь была очищена. Учитывая заявление Apple, это гарантирует, что только одно уведомление будет отправлено только после того, как все операции будут завершены.
Если операции добавляются способом, который не позволяет обнаружить последний (то есть недетерминированным), то я думаю, что вы должны использовать упомянутые выше подходы КВО, с добавлением дополнительной защитной логики, чтобы попытаться определить, могут ли быть добавлены дополнительные операции.
:)