2013-03-20 65 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 – 2013-03-20 08:55:28

+0

@ Daij-Djan我是成功處理程序,而不是完成完成的完成程序! – Groot 2013-03-20 09:05:06

+1

if(!error)= success:D – 2013-03-20 09:12:08

回答

15

是的,完成處理程序總是被調用。如果請求由於超時而失敗,則將設置error,並設置data = nil

A NSURLRequest的默認超時時間爲60秒,但您可以在開始連接之前爲request.timeoutInverval分配一個不同的值。所以不需要額外的計時器。

新增:在超時的情況下:

  • [error domain]NSURLErrorDomain,並
  • [error code]NSURLErrorTimedOut

如果你只是想提出一個錯誤信息,您可以使用[error localizedDescription],即「請求超時」。在這種情況下。 (這可能取決於語言環境。)

+0

很好的回答,謝謝! – Groot 2013-03-20 08:34:22

+0

@菲利普:不客氣。我已經添加了一些信息如何檢查超時。 – 2013-03-20 08:43:18

0

[NSURLConnection的sendAsynchronousRequest:...]肯定會調用任何情況下完成的塊。但是,如果要限制此過程的最長時間,也可以使用超時計時器。

對於進度條,您將如何增加值?我不建議進度條,而是建議你帶上活動指標。

希望這會有所幫助。

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

請嘗試解釋你做了什麼以及爲什麼。人們很少從僅有代碼的答案中學習。 – Jasper 2014-02-18 13:10:16

相關問題