我的应用程序需要从网络上获取一些图像,但我希望用户能够取消此下载(如果它没有连接,或者它太慢,或者 w/e)。无论如何,应用程序界面都不应该被“冻结”。所以我使用AFHTTPClient
withenqueueBatchOfHTTPRequestOperations: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取消检查中的 Canceling batch request 是在 中completionBlock:
,正是我要放它的地方!但在我的情况下,如果任何操作被取消,这个块就不会执行!也许我在配置我的 AFHTTPClient 时遗漏了一些东西?