2013-03-20 3 views
5

Скорее всего, довольно тривиальный вопрос, но будет ли вызываться блок завершения с помощью [NSURLConnection sendAsynchronousRequest: ...]? ИЛИ мне нужно реализовать таймер тайм-аута?Будет ли [NSURLConnection sendAsynchronousRequest: ...] всегда отправлять блок завершения?

Рассмотрим следующий пример, где я добавить MBProgressView перед вызовом и снимите его только в блоке завершения:

[self showHUDWithTitle:@"Configuring"]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:[[NSOperationQueue alloc] init] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, 
              NSError *error) { 

    if ([data length] >0 && error == nil) { 
     [self hideHUDWithFlag:YES 
         andTitle:@"Finished" 
        andSubtitle:@"(Box was configured)"]; 

    } else if ([data length] == 0 && error == nil) { 
     [self hideHUDWithFlag:NO 
         andTitle:@"Failed" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Nothing was downloaded."); 

    } else if (error != nil) { 
     [self hideHUDWithFlag:NO 
        andTitle:@"Error" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Error = %@", error); 
    } 
}]; 
+0

естественно. обработчик завершения - это обработчик COMPLETION - не обработчик успеха: D –

+0

@ Daij-Djan Я - обработчик успеха, а не дополнение, которое завершает завершение! – Groot

+1

если (! Ошибка) = успех: D –

ответ

15

Да, обработчик завершения всегда называется. Если запрос завершился с ошибкой из-за таймаута, будет установлен error и data = nil.

A NSURLRequest имеет таймаут по умолчанию 60 секунд, но перед началом соединения вы можете назначить другое значение request.timeoutInverval. Таким образом, нет необходимости в дополнительном таймере.

Добавлено: В случае тайм-аута:

  • [error domain] является NSURLErrorDomain и
  • [error code] является NSURLErrorTimedOut,

Если вы хотите представить сообщение об ошибке, вам может использовать [error localizedDescription], что означает «запрос был истекло». в этом случае. (Это может зависеть от региона.)

+0

Отличный ответ, спасибо! – Groot

+0

@Filip: Добро пожаловать. Я добавил некоторую информацию о том, как вы можете проверить тайм-аут. –

0

[NSURLConnection sendAsynchronousRequest: ...], безусловно, назвать блок завершения в любом случае. Однако, если вы хотите ограничить этот процесс максимальным временем, вы также можете использовать таймер тайм-аута.

Для индикатора выполнения, как вы будете увеличивать значение? Вместо индикатора прогресса я бы предложил вам перейти с индикатором активности.

Надеюсь, это поможет.

2
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
               cachePolicy:NSURLCacheStorageAllowed    
              timeoutInterval:20]; 
+2

Пожалуйста, попробуйте объяснить, что вы сделали и почему. Люди редко учатся только из кодовых ответов. – Jasper