私のアプリはウェブからいくつかの画像を取得する必要がありますが、ユーザーがこのダウンロードをキャンセルできるようにしたいです (接続がない場合、または遅すぎる場合、または w/e)。どのような場合でも、アプリ インターフェイスは「凍結」されるべきではありません。だから私はダウンロードするためのメソッドを使用AFHTTPClient
しています:enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:
NSMutableArray *operationsArray = [NSMutableArray array];
for (NSString *imageURL in imageURLArray) {
AFImageRequestOperation *getImageOperation =
[AFImageRequestOperation imageRequestOperationWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]]
imageProcessingBlock:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
//
// Save image
//
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
if((error.domain == NSURLErrorDomain) && (error.code == NSURLErrorCancelled))
NSLog(@"Image request cancelled!");
else
NSLog(@"Image request error!");
}];
[operationsArray addObject:profileImageOperation];
}
//
// Lock user interface by pop-up dialog with process indicator and "Cancel download" button
//
[afhttpClient enqueueBatchOfHTTPRequestOperations:operationsArray
progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
//
// Handle process indicator
//
} completionBlock:^(NSArray *operations) {
//
// Remove blocking dialog, do next tasks
//
}];
「ダウンロードをキャンセル」ボタンを押した場合:
- (void)cancelDownloadDialogButtonClicked {
[afhttpClient.operationQueue cancelAllOperations];
}
私の問題は次のとおりです。
操作エラーとキャンセルをどこで確認すればよいかわかりません (このような場合、ダウンロード全体をキャンセルし、UI ブロック ダイアログを削除したい)。私の意見では、 にあるcompletionBlock:
のが最適な場所ですenqueueBatchOfHTTPRequestOperations:
。すべての操作が完了し、 にアクセスできることが保証されているため、 で行っNSArray *operations
たように、エラーかキャンセルかを確認できますfailure:
。しかし、このブロックはそのような場合でも実行されないことがわかりました (おそらく isCancelled、isFinished、isExecuting プロパティの仕組みのため)。
エラーが発生した場合、またはユーザーが「ダウンロードのキャンセル」ボタンを押した場合、UI ブロック ダイアログを削除してダウンロードをキャンセルするにはどうすればよいですか?
アップデート
理由はわかりませんが、この例では、AFNetworking のキャンセル チェックでバッチ リクエストをキャンセルcompletionBlock:
しています。しかし、私の場合、操作がキャンセルされた場合、このブロックは実行されません! 私のAFHTTPClientの設定で何かが足りないのでしょうか?