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];

Удалить диалог блокировки пользовательского интерфейса

Вы должны включить код для удаления этого набора в

  1. где вы называете этот код
  2. Когда закончено успешно в завершающем блоке

Чтобы было понятно

- (void)cancelDownloadDialogButtonClicked {
    [afhttpClient.operationQueue cancelAllOperations];
    //DO Remove the UI blocking mechanism here Eg.
    [SVProgressHUD dismiss];
}
Другие вопросы по тегам