2010-01-15 1 views
20

NSURLConnection sendSynchronousRequest를 사용하여 오류 처리를 향상시키는 방법은 무엇입니까? 내가 동기화 요청을 왜 내가 백그라운드에서 데이터를 가져 오는하는 nsoperation 큐가 난NSURLConnection sendSynchronousRequest를 사용하여 오류 처리

- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error 

을 구현할 수있는 방법이 먹으 렴입니다. 그리고 비동기 요청을 구현해야한다면 어떻게 완료 될 때까지 기다릴 수 있습니까? 그 방법은 데이터 없이는 진행될 수 없기 때문입니다.

답변

30

-sendSynchronousRequest : returningResponse : 오류 : 메소드 자체에서 오류를 바로 얻을 수있는 방법을 제공합니다. 마지막 인수는 실제로 (NSError **) 오류입니다. 즉, NSError 포인터에 대한 포인터입니다. 이것을 시도하십시오 :

NSError  *error = nil; 
NSURLResponse *response = nil; 

[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error]; 

if (error) {...handle the error} 
+8

이 전무에 오류 응답을 초기화 할 수 있는지 확인하십시오, 나는이 대답을 찾아 낼 때까지 나는 EXC_BAD_ACCESS 오류를 얻고 있었다. 감사 +1! – keegan3d

+9

오류를 테스트하기 전에 결과를 테스트해야합니다. 문서에서 * "연결을 만들 수 없거나 다운로드에 실패하면 nil을 반환합니다."* http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference .html # // apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest : returningResponse : 오류 : – ohhorob

+5

코코아 [보증] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError .html # // apple_ref/doc/uid/TP40001806-CH204-SW1) 메소드가 실패하면 오류 오브젝트가 유효합니다. 메서드가 성공하면 오류 개체가'nil'이 될 것이라고 보장하지 않습니다. 오류를 사용하기 전에 직접 리턴 값을 확인해야합니다. –

55

오류가 발생했음을 나타 내기 위해 nil이 아닌 오류에 의존하지 않겠습니다.

Ben의 대답에 설명 된대로 오류 검사를 사용하고 있지만 일부 상황에서는 오탐/거짓 오류가 발생한다고 생각합니다.

SO answer에 따라이 메서드의 결과를 사용하여 성공/실패를 결정합니다. 그런 다음 오류 포인터에서 오류의 세부 사항을 확인하십시오.

NSError *requestError; 
NSURLResponse *urlResponse = nil; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; 
/* Return Value 
    The downloaded data for the URL request. Returns nil if a connection could not be created or if the download fails. 
*/ 
if (response == nil) { 
    // Check for problems 
    if (requestError != nil) { 
     ... 
    } 
} 
else { 
    // Data was received.. continue processing 
} 

이러한 접근 방식은 실패하지 않았다 다운로드 과정에서 발생한 오류에 반응하지 않도록합니다. 다운로드가 진행됨에 따라 프레임 워크 내에서 처리되는 중요하지 않은 오류가 발생할 수 있으며 오류 객체로 오류 포인터를 설정하는 부작용이있을 수 있다고 생각합니다.

예를 들어 URL 연결 처리 과정에서 심화 된 것으로 보이는 응용 프로그램을 다운로드 한 사용자가 POSIX 오류를보고했습니다. ..

requestError.domain = NSPOSIXErrorDomain 
requestError.code = 22 
[requestError localizedDescription] = Operation could not be completed. Invalid argument 

내가 한 모든를 다시

Platform: iPhone 
Error ID: (NSPOSIXErrorDomain)[22] 
Msg: Operation could not be completed. Invalid argument 

매핑 :

이 코드는 오류보고하는 데 사용됩니다 :

NSString *errorIdentifier = [NSString stringWithFormat:@"(%@)[%d]",requestError.domain,requestError.code]; 
[FlurryAPI logError:errorIdentifier message:[requestError localizedDescription] exception:nil]; 

을 그리고 오류가보고 나타납니다 오류 코드 22는 EINVAL이지만 그 이상의 세부 사항은 밝혀지지 않았습니다. 내가 할

다른 오류가 나는 완전히 다양한 네트워크 조건에서 기대하는 NSURL 도메인에서 다음과 같습니다

NSURLErrorTimedOut 
NSURLErrorCannotConnectToHost 
NSURLErrorNetworkConnectionLost 
NSURLErrorNotConnectedToInternet 
+others 
+0

결과를 사용하여 성공/실패를 판단하는 것이 유일한 방법이며이를 정확하게 문서화합니다. 처음 두 단락은 "Ben의 대답이 잘못되었습니다. 이것이 올바른 방법입니다." :) – bbum