おそらくあなたを助けるWWDCビデオ(2012)があります。カスタムNSOperationQueue
を使用し、非同期ブロックを内部にNSOperations
配置するため、ブロックのハンドルを保持し、残りのキューに入れられたブロックをキャンセルできます。
子ブロックのエラー処理を使用して、を処理するクラスのメインスレッドでメソッドを呼び出すことをお勧めしますNSOperationQueue
。その後、クラスは残りを適切にキャンセルできます。このように、子ブロックは自分のスレッドとメインスレッドについてのみ知る必要があります。ここにビデオへのリンクがあります
https://developer.apple.com/videos/wwdc/2012/
このビデオは「iOSでの同時ユーザーインターフェイスの構築」と呼ばれています。関連する部分は主に後半にありますが、それが文脈にうまく収まっているので、おそらく全体を見たいと思うでしょう。
編集:
可能であれば、埋め込みブロックで応答を処理することをお勧めします。これにより、応答がうまくまとめられます。これが、あなたが求めているものだと思います。
//Define an NSBlockOperation, and get weak reference to it
NSBlockOperation *blockOp = [[NSBlockOperation alloc]init];
__weak NSBlockOperation *weakBlockOp = blockOp;
//Define the block and add to the NSOperationQueue, when the view controller is popped
//we can call -[NSOperationQueue cancelAllOperations] which will cancel all pending threaded ops
[blockOp addExecutionBlock: ^{
//Once a block is executing, will need to put manual checks to see if cancel flag has been set otherwise
//the operation will not be cancelled. The check is rather pointless in this example, but if the
//block contained multiple lines of long running code it would make sense to do this at safe points
if (![weakBlockOp isCancelled]) {
//substitute code in here, possibly use *synchronous* NSURLConnection to get
//what you need. This code will block the thread until the server response
//completes. Hence not executing the following block and keeping it on the
//queue.
__block NSData *temp;
response = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
[operationQueue addOperationWithBlock:^{
if (error) {
dispatch_async(dispatch_get_main_queue(), ^{
//Call selector on main thread to handle canceling
//Main thread can then use handle on NSOperationQueue
//to cancel the rest of the blocks
});
else {
//Continue executing relevant code....
}
}];
}
}];
[operationQueue addOperation:blockOp];