Nếu bạn đang mong đợi (hoặc mong muốn) điều gì đó phù hợp với hành vi này:
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>
Bạn nên lưu ý rằng nếu một số hoạt động "ngắn" đang được thêm vào hàng đợi, bạn có thể thấy hành vi này thay thế (vì các hoạt động được bắt đầu như một phần của việc được thêm vào hàng đợi):
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>
Trong dự án của mình, tôi cần biết khi nào hoạt động cuối cùng hoàn thành, sau khi một số lượng lớn hoạt động đã được thêm vào NSOperationQueue nối tiếp (tức là, maxConcurrentOperationCount = 1) và chỉ khi tất cả chúng đã hoàn thành.
Googling Tôi đã tìm thấy tuyên bố này từ một nhà phát triển của Apple để trả lời cho câu hỏi "có phải là NSoperationQueue FIFO nối tiếp không?" -
Nếu tất cả các hoạt động có cùng mức ưu tiên (không bị thay đổi sau khi hoạt động được thêm vào hàng đợi) và tất cả các hoạt động luôn - isReady == YES vào thời điểm chúng được đưa vào hàng đợi hoạt động, thì NSOperationQueue nối tiếp là FIFO.
Chris Kane Khung ca cao, Apple
Trong trường hợp của tôi, có thể biết khi nào thao tác cuối cùng được thêm vào hàng đợi. Vì vậy, sau khi thao tác cuối cùng được thêm, tôi thêm một thao tác khác vào hàng đợi, có mức độ ưu tiên thấp hơn, thao tác này không làm gì khác ngoài việc gửi thông báo rằng hàng đợi đã được làm trống. Theo tuyên bố của Apple, điều này đảm bảo rằng chỉ có một thông báo duy nhất được gửi sau khi tất cả các hoạt động đã hoàn thành.
Nếu các hoạt động đang được thêm vào theo cách không cho phép phát hiện cái cuối cùng, (tức là không xác định) thì tôi nghĩ bạn phải thực hiện với các phương pháp KVO được đề cập ở trên, với logic bảo vệ bổ sung được thêm vào để cố gắng phát hiện nếu xa hơn các hoạt động có thể được thêm vào.
:)