2010-01-05 3 views
3

현재 외부 API에서 일부 XML을 읽는 중입니다. initWithContentsOfURL의 이상한 오류

다음 코드

잘 작동합니다 :

NSError *error = nil; 

NSString *xmlString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 

그러나, 내가 처리 일부 오류 ("서버에 연결할 수 없습니다", "인터넷 연결"등)을 추가하고 싶었다. 그래서, 나는 도달 가능성의 샘플 코드의 도움으로 장소에 블록을 넣어 :

if ([error code] == kCFURLErrorNotConnectedToInternet) { 
     NSDictionary *userInfo = [NSDictionary dictionaryWithObject:NSLocalizedString(@"No Internet connection",@"Error message displayed when not connected to the Internet.") forKey:NSLocalizedDescriptionKey]; 
     NSError *noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain code:kCFURLErrorNotConnectedToInternet userInfo:userInfo]; 
     [self handleError:noConnectionError]; 
    } else { 
     // otherwise handle the error generically 
     [self handleError:error]; 
    } 

는 handleError 방법은 단순히 오류의 세부 사항과 함께 UIAlertView를 표시합니다. 연결이없는 앱을 실행하면 오류 메시지가 표시 될 것으로 예상됩니다. 그러나 내가 얻은 것은 "작업을 완료 할 수 없습니다 (Cocoa error 256)"입니다. 내가 수집 할 수있는 것은 일반적인 읽기 오류입니다.

처음에는 TouchXML의 메소드일지도 모르겠지만, 알다시피 NSString의 initWithCOntentsOfURL로 변경했습니다.

누구든지이 문제에 관해 밝힐 수 있습니까?

감사합니다,

리치

+0

P.S 있는지 확인 통과; 'initWithContentsOfURL :'은 동기 방식입니다. 따라서 NSOperation/GCD 블록에 포장하거나 비동기 네트워킹으로 전환하십시오. –

답변

0

당신은 kCFURLErrorNotConnectedToInternet보다 다른 오류 메시지가 표시됩니다. 오류 메시지가 사용자 지정 오류에서 오는 것이 아니라 내부적으로 일부 개체에 의해 생성됩니다. 사용자 정보를 보려면 실제로 얻은 오류의 userInfo dict을 덤프해야합니다. 나는 당신이 그것을 모두 얻는 것을 확인하기 위해 경고를 사용하는 대신에 그것을 기록 할 것이다.

userInfo dict가 실제로 비어있는 경우 URL을 테스트하여 실제로 아무 것도 반환하는지 확인합니다. 데이터 객체를 초기화하고 얻은 결과를 확인하십시오. 그러면 URL의 문제와 데이터를 문자열로 변환하는 문제 사이에 범위가 좁혀집니다.

+0

인터넷에 연결되면 XML이 다운로드되어 문자열이나 touchxml 객체에 잘 들어갑니다. 연결되지 않은 경우 오류가 필요합니다. 오류가 잘못된 것일뿐입니다. 풍부한 – Rich

0

이 시도하지 : 1) dataWithContentsOfURL 2 사용을 NSData 만들기) 없음을 NSData 위에서 생성 null가 아닌 경우 즉, 만 xmlString을 생성 (데이터)