この動作に一致するものを期待している(または望んでいる)場合:
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)、すべてが完了したときにのみ、最後の操作がいつ完了したかを知る必要がありました。
グーグル私は、「シリアルNSoperationQueue FIFOですか?」という質問に答えて、Apple開発者からこのステートメントを見つけました。 -
すべての操作の優先度が同じで(操作がキューに追加された後も変更されない)、すべての操作が操作キューに入れられるまでに常に--isReady == YESである場合、シリアルNSOperationQueueはFIFOです。
クリスケインココアフレームワーク、アップル
私の場合、最後の操作がいつキューに追加されたかを知ることができます。したがって、最後の操作が追加された後、優先度の低い別の操作をキューに追加します。これは、キューが空になったという通知を送信するだけです。Appleの声明を考えると、これにより、すべての操作が完了した後にのみ1つの通知のみが送信されることが保証されます。
最後の操作を検出できない方法で操作が追加されている場合(つまり、非決定論的)、上記のKVOアプローチを使用し、さらにガードロジックを追加して検出を試みる必要があると思います。操作が追加される場合があります。
:)