2011-01-02 4 views
1

그래서 전달하고 싶은 것들로 포장 된 XML 문서를 반환하는 API에 대해 인증하는 함수를 작성하고 있습니다. 이 함수는 NSURLConnection의 sendSynchronousRequest 메서드를 사용하여 동기식 호출을 매우 쉽게 만들 수 있습니다. 그러나이 메서드가 반환되면 NSXMLParser의 인스턴스를 인스턴스화하고 데이터로 시작하고 구문을 분석 할 필요가 있습니다.비동기 Cocoa 클래스가 동기식으로 작동하도록 만들기

내가 원하는 기능은 sendSynchronousRequest 반환합니다.), NSXMLParser를 인스턴스화하고, 구문 분석 할 데이터를 제공하고, 단일 메서드 호출에서 구문 분석을 시작하고 구문 분석이 끝날 때까지 반환하지 않습니다. 예를 들어

: 위의 예에서

- (void) myFunction 
{ 
/* other code */ 
NSData *returnedData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&authResponse error:&authError]; 

MyParserClass *parser = [[MyParserClass alloc] initWithData:returnedData]; 
[parser parseData]; 
} 

, MyParserClass는 NSXMLParser의 대표이며, 보통, 위임 방식으로 모든 구문 분석을 수행합니다. parseData은 구문 분석을 시작하고 끝날 때까지 반환하지 않습니다.

어떤 방식으로 작성해야합니까? parseData? 블록 접근?

편집 : 방금 NSXMLParser의 -parse 함수가 동기식임을 기억합니다. 아직도, 나는 어떤 종류의 비동기 클래스에서 이것을 할 수있는 방법을 누군가 설명 할 수 있는지 알고 싶다.

+0

이 모든 것이 백그라운드 스레드에서 발생합니다. 맞습니까? 동기식 네트워킹은 Cocoa에서 거의 절대적인 접근 방식이 아닙니다. –

답변

3

NSXMLParserDelegate 프로토콜 (예 : MyParserDelegate)을 구현하는 클래스를 작성하는 것이 좋습니다. 대리자 메서드가 파서에 의해 호출되면 XML 파일에서 추출 할 정보가 들어있는 데이터 구조를 작성해야합니다.

 
// create the delegate 
MyParserDelegate *delegate = [[MyParserDelegate alloc] init]; 

// create the parser 
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:returnedData]; 
[parser setDelegate:delegate]; 

// parse the file 
if ([parser parse]) 
{ 
    // the XML was valid and parsed without error 
    // now, do something with the data you extracted 
    // e.g., self.xmlData = [delegate xmlBasedDataStructureBuiltByDelegate]; 
} 
else 
{ 
    // the XML was invalid 
    // handle the error 
} 

MyParserDelegate의 기능을 사용하면 XML 파일에서 추출하려는 작업에 달려 다음과 같이 내가 전화 것입니다. 자세한 내용은 Apple의 Event-Driven XML Programming Guide을 읽는 것이 좋습니다.

동기화 NSURLConnection을 사용하려면 백그라운드 스레드에서이 작업을 수행해야합니다.

+0

응답 주셔서 감사합니다 pwc; 불행히도 그것은 내 질문에 대답하지 않습니다. 동기식으로 동작하도록 비동기 클래스/API를 강제하는 방법론에 관심이 있습니다. 내 문제는 대부분 내 프로그램에서 다른 곳에서 반환 할 때 한 호출에서 다음을 수행해야 할 필요가있는 함수 ('myFunction'위의)를 작성한 것이므로 대부분 질문에 대한 질문입니다. 서버와 통신하고 응답을 구문 분석하여 해당 데이터를 저장합니다. 문제는 두 번째 부분이 비동기 API를 기반으로하며 내 기능이 그 고유 한 특성을 유지하는 데 도움이되지 않는다는 것입니다. –

+2

블록을 사용할 필요가 없습니다. 계속 진행되는 비동기가 없습니다. 특히 NSXMLParser는 비동기 적이 지 않습니다. 구문 분석이 완료되면'[NSXMLParser parse]'가 반환됩니다. 비동기식이면 즉시 반환되고 처리가 완료되면 대리인에게 알립니다. 델리게이트를 고소하기 때문에 비동기 적으로 보입니다.하지만 그렇지 않습니다. 일반적으로 스레드와 동기화 메커니즘을 사용하여 비동기 프로세스를 동기화할 수 있습니다. 비동기를 수행하기 위해 스레드를 시작할 수 있습니다. 작업을 완료하고 스레드가 완료 될 때까지 기다립니다. – pwc

관련 문제