1

行列を作ります

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

キューを非同期リクエストに送信します

[NSURLConnection sendAsynchronousRequest:req queue:operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // ... do stuff here
    });
}];

途中でキャンセルします

[operationQueue cancelAllOperations];

ただし、非同期の「完了」コードがまだ実行されていることがわかります。このシナリオが期待どおりに機能しないのはなぜですか?

4

2 に答える 2

1

isCancelled途中でキャンセルされた場合に備えて、操作のタスク中に確認するのはあなたの責任ではありませんか?

NSOperationQueue はタスクを強制終了するだけでなく、タスクをキャンセル済みとして設定し、タスク自体を終了させます。これにより、割り当てた可能性のあるリソースをクリーンアップし、終了する前に片付けることができます。

まだ開始されていないタスクは開始されません。

于 2012-06-19T15:59:18.640 に答える
1

cancelAllOperationsキュー内のアイテムを調べて、cancelそれぞれを呼び出します。のドキュメントを見るとcompletionBlock

指定した完了ブロックは、isFinished メソッドによって返された値が YES に変わると実行されます。したがって、このブロックは、操作のプライマリ タスクが終了またはキャンセルされた後に、操作オブジェクトによって実行されます。

ここで見ることができます

編集:

のドキュメントからの別のスニペットsetCompletionBlock:

終了した操作は、キャンセルされたか、タスクが正常に完了したために終了する場合があります。ブロックコードを書くときは、その事実を考慮に入れる必要があります。同様に、依存する操作自体がキャンセルされている可能性があるため、その操作が正常に完了したと仮定してはなりません。

于 2012-06-19T15:52:19.680 に答える