Якщо ви очікуєте (або бажаєте) чогось, що відповідає цій поведінці:
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.
Кріс Кейн Какао Frameworks, Apple
У моєму випадку можна дізнатись, коли остання операція була додана до черги. Тож після додавання останньої операції я додаю до черги ще одну операцію, нижчого пріоритету, яка не робить нічого, крім як надсилає повідомлення про те, що черга була звільнена. Враховуючи заяву Apple, це гарантує, що лише одне повідомлення надсилається лише після завершення всіх операцій.
Якщо операції додаються таким чином, що не дозволяють виявити останню (тобто недетерміновану), тоді я думаю, що вам слід скористатися згаданими вище підходами KVO, додавши додаткову логіку захисту, щоб спробувати виявити, чи буде подальше можуть бути додані операції.
:)