Jika Anda mengharapkan (atau menginginkan) sesuatu yang cocok dengan perilaku ini:
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>
Anda harus menyadari bahwa jika sejumlah operasi "pendek" sedang ditambahkan ke antrian Anda mungkin melihat perilaku ini sebagai gantinya (karena operasi dimulai sebagai bagian dari penambahan ke antrian):
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>
Dalam proyek saya, saya perlu mengetahui kapan operasi terakhir selesai, setelah sejumlah besar operasi telah ditambahkan ke serial NSOperationQueue (yaitu, maxConcurrentOperationCount = 1) dan hanya ketika semuanya telah selesai.
Googling Saya menemukan pernyataan ini dari pengembang Apple sebagai tanggapan atas pertanyaan "apakah serial NSoperationQueue FIFO?" -
Jika semua operasi memiliki prioritas yang sama (yang tidak berubah setelah operasi ditambahkan ke antrian) dan semua operasi selalu - isReady == YES pada saat mereka dimasukkan ke dalam antrian operasi, maka NSOperationQueue serial adalah FIFO.
Kerangka Kakao Chris Kane, Apple
Dalam kasus saya, dimungkinkan untuk mengetahui kapan operasi terakhir ditambahkan ke antrian. Jadi setelah operasi terakhir ditambahkan, saya menambahkan operasi lain ke antrian, dengan prioritas lebih rendah, yang tidak melakukan apa-apa selain mengirim pemberitahuan bahwa antrian telah dikosongkan. Berdasarkan pernyataan Apple, ini memastikan bahwa hanya satu pemberitahuan yang dikirim hanya setelah semua operasi selesai.
Jika operasi ditambahkan dengan cara yang tidak memungkinkan untuk mendeteksi yang terakhir, (yaitu, non-deterministik) maka saya pikir Anda harus menggunakan pendekatan KVO yang disebutkan di atas, dengan logika penjaga tambahan ditambahkan untuk mencoba mendeteksi jika lebih jauh operasi dapat ditambahkan.
:)