5

NSOperationsに追加されたものがたくさんありNSOperationQueueます。操作キューはmaxConcurrentOperationCount1 に設定されているため、NSOperations次々に実行されます。

今、 の でcompletionBlockを呼び出して、NSOperation保留中のすべてをキャンセルしたいと思います。NSOperationscancelAllOperationsNSOperationQueue

これを行うのは安全ですか?次の操作の -method が、前の操作の が完全に実行されたstart後にのみ呼び出されることを確認できますか? completionBlockまたはcompletionBlock、前の操作の と現在の操作のタスクが同時に実行されますか?

私が質問している理由: AFNetworking を使用してバッチを実行し、バッチのAFHTTPRequestOperations以前のすべての要求が成功した場合にのみ、1 つの要求を実行したいと考えています。

4

3 に答える 3

5

以下の私の調査結果は、もはや真実ではないようです。iOS 8 と iOS 9 でテストを再実行しましたが、操作の完了ブロックは常に次の操作と同時に実行されます。現在、前の完了ブロックが完了するまで操作を待機させる方法がわかりません。


サンプルプロジェクトでこのシナリオを試しました。結果は次のとおりです。

が 1 に設定されている場合、とキュー内の次のものが同時に実行さNSOperationQueueれます。maxConcurrentOperationCountNSOperationcompletionBlockNSOperation

ただし、NSOperationを呼び出すことによって every が前の操作にリンクされている場合addDependency:、操作の実行は、前の操作completionBlockが完了するまで待機します。

そのため、現在の操作の次の操作をキャンセルし、completionBlock開始前に確実にキャンセルする場合は、NSOperations呼び出しによって間の依存関係を設定する必要があります。addDependency:

于 2012-07-11T08:04:33.683 に答える