AFHTTPClient + enqueueBatchOfHTTPRequestOperations: обрабатывать отмену и ошибки
Моему приложению нужно получить некоторые изображения из Интернета, но я хочу, чтобы пользователь мог отменить загрузку (если нет соединения, или он слишком медленный, или 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];
}
Моя проблема:
Я не знаю, где я должен проверять ошибки операций и отмены (я хочу отменить всю загрузку и удалить диалоговое окно блокировки пользовательского интерфейса в таких случаях). На мой взгляд, лучшее место для этого в completionBlock:
из enqueueBatchOfHTTPRequestOperations:
потому что это гарантия того, что все операции были выполнены, и я получил доступ к NSArray *operations
так что я могу проверить это ошибка или отмена, как я сделал в failure:
, Но я обнаружил, что этот блок даже не выполняется в таких случаях (возможно, из-за isCancelled, isFinished, isExecuting правильных механизмов).
Итак, как мне удалить диалоговое окно блокировки пользовательского интерфейса и отменить загрузку, если произошла ошибка или пользователь нажал кнопку "Отменить загрузку"?
Обновить
Понятия не имею почему, но в этом примере Отмена пакетного запроса в проверке отмены AFNetworking находится в completionBlock:
Точно, куда я собирался это положить! Но в моем случае этот блок не выполняется, если какая-либо операция была отменена! Может быть, мне не хватает чего-то в настройке моего AFHTTPClient?
1 ответ
Для отмены всех операций используйте
[[client operationQueue] cancelAllOperations];
Удалить диалог блокировки пользовательского интерфейса
Вы должны включить код для удаления этого набора в
- где вы называете этот код
- Когда закончено успешно в завершающем блоке
Чтобы было понятно
- (void)cancelDownloadDialogButtonClicked {
[afhttpClient.operationQueue cancelAllOperations];
//DO Remove the UI blocking mechanism here Eg.
[SVProgressHUD dismiss];
}