หากคุณคาดหวัง (หรือต้องการ) บางสิ่งที่ตรงกับพฤติกรรมนี้:
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) และเมื่อดำเนินการเสร็จสิ้นทั้งหมดเท่านั้น
Googling ฉันพบคำสั่งนี้จากนักพัฒนา Apple เพื่อตอบคำถาม "is a serial NSoperationQueue FIFO?" -
หากการดำเนินการทั้งหมดมีลำดับความสำคัญเท่ากัน (ซึ่งไม่มีการเปลี่ยนแปลงหลังจากเพิ่มการดำเนินการลงในคิว) และการดำเนินการทั้งหมดจะเสมอ - isReady == ใช่เมื่อถึงเวลาที่พวกเขาใส่ในคิวการดำเนินการดังนั้น NSOperationQueue แบบอนุกรมคือ FIFO
กรอบ Chris Kane Cocoa, Apple
ในกรณีของฉันเป็นไปได้ที่จะทราบเมื่อมีการเพิ่มการดำเนินการล่าสุดลงในคิว ดังนั้นหลังจากเพิ่มการดำเนินการล่าสุดฉันจึงเพิ่มการดำเนินการอื่นในคิวที่มีลำดับความสำคัญต่ำกว่าซึ่งไม่ได้ทำอะไรเลยนอกจากส่งการแจ้งเตือนว่าคิวว่าง จากคำชี้แจงของ Apple สิ่งนี้ทำให้มั่นใจได้ว่าจะมีการส่งหนังสือแจ้งเพียงครั้งเดียวหลังจากการดำเนินการทั้งหมดเสร็จสิ้น
หากมีการเพิ่มการดำเนินการในลักษณะที่ไม่อนุญาตให้ตรวจจับการดำเนินการสุดท้าย (เช่นไม่กำหนดปัจจัย) ฉันคิดว่าคุณต้องใช้แนวทาง KVO ที่กล่าวถึงข้างต้นโดยเพิ่มตรรกะการป้องกันเพิ่มเติมเพื่อพยายามตรวจจับว่าเพิ่มเติม อาจมีการเพิ่มการดำเนินการ
:)