2013-09-03 3 views
-1

NSXML 파서를 사용하여 웹 서비스에서 수신 한 SOAP 응답 XML을 구문 분석했습니다. 내가 theRequest 변수가 내 SOAP 요청을 가지고 내 SOAP 요청을 보내려면이 코드를 사용 NSXML 파서는 프로그램 흐름이 어디로 이동합니까?

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

내 루트 방법에 . 데이터 받았다 그래서 후,

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    //codes to recieve webData 
    xmlParser = [[NSXMLParser alloc] initWithData: _webData]; 
[_xmlParser setDelegate: self]; 
[_xmlParser setShouldResolveExternalEntities: YES]; 
[_xmlParser parse]; 

} 

이제 프로그램 didStartElement, didFinishDocument 방법 흐른다. 내 루트 메서드는 xml을 구문 분석 한 후 얻은 결과를 반환해야하지만 중단 점을 사용하여 프로그램 흐름을 검사 할 때 구문 분석 메서드는 return 문이 내 코드에서 호출되기 전에 끝나지 않으므로 구문 분석 된 값을 반환 할 수 없습니다. 어떻게 해결할 수 있습니까?

답변

2

NSXMLParser은 완전히 동기식으로 작동합니다. [_xmlParser parse]이 반환되면 모든 구문 분석이 완료됩니다 (또는 오류와 함께 중단됨).

+0

예 XML 파서가 모든 구문 분석을 완료했지만 모든 구문 분석이 완료 될 때까지 xml 파서가 문서를 구문 분석하기를 기다리지 않고 응용 프로그램 흐름이 내 프로그램에서 계속됩니다. –

+0

@YugeshShrestha : 문제는 'NSURLConnection'이 비동기 적으로 작동한다는 것입니다. –

+0

음, 그렇습니다. NSURLConnection이 끝날 때까지 다른 UI 요소를 잠그지 만 사용자가 응용 프로그램이 실행 중이며 고정되어 있지 않다는 것을 알게 될 때까지로드 바 종류를 표시 할 수 있습니까? –

0

설명에 따르면 문제가 명확하지 않습니다. 문제는 루트 요소가 구성된 후에도 NSXMLParser의 구문 분석 메서드 내에있는 동안 계속 프로그램을 처리한다는 것입니다.

해결하려면 주 스레드에서 선택기를 호출하여 파서의 위임 결과 (루트 요소)를 결국 처리하는 메서드에 전달합니다. 또는 루트 요소를 처리하는 메소드를 호출하는 주 스레드에 대해 dispatch_async를 사용하십시오.

관련 문제