2012-06-09 5 views
1

URL에서 오히려 간단한 XML 파일을로드하고 있습니다. 파서가 파일을로드하는 동안 네트워크 활동 표시기를 표시하려고했지만 파싱하는 동안은 분명히 표시하지 않았습니다.[NSXMLParser initcontentsofurl : ...]로드하는 동안 잠급니까?

질문 : URL에서 문서를로드하는 동안 initWithContentsOfUrl : 메소드가 프로그램 실행을 잠그나요? 즉, 아래의 코드가 정확합니까?

이것은 나에게 명백한 것처럼 보이지만, 100 % 확신하고 싶습니다. 당신이 다운로드 진행 상황을 표시하려면

NSString* const urlString = @"..."; 
NSURL* url = [NSURL URLWithString:urlString]; 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

답변

4

이 문서는 꽤 잘 http://akosma.com/2010/05/28/initwithcontentsofurl-methods-considered-harmful/을 설명합니다

이러한 방법의 주된 문제는 물론, 그들은 이 있다는 사실이다 동기; 즉,을 반환하고 대부분 응용 프로그램을 반환 할 때까지 스레드를 실행하는 스레드 (일반적으로 UI 스레드) 은 완전히 차단되어 이로 인해 사용자가 알 수없는 시간 동안 전체 응용 프로그램을 사실상 차단하고 있음을 의미합니다. 즉, 또는 UI 위젯이 입력에 반응하지 않고 탐색 할 수 없으며 터치 이벤트가 전달되거나 실행되지 않습니다. 네트워크 작업이 완료 될 때까지는 아무 것도 발생하지 않습니다. .

더욱 악화됩니다. initWithContentsOfURL :을 사용하면 시간 제한이 없으며 네트워크 오류에 대한 의미있는 피드백이없고 사용자가 현재 네트워크 작업을 취소 할 수 없습니다. 이 마지막 요소 은 자체적으로 initWithContentsOfURL을 사용하지 않는다는 것을 정당화합니다. 당신은 나쁜 사용자 경험으로 이어지는 코드를 배송하지 않아야합니다. 귀하의 사용자는 을 보내고 불평 할 것입니다.

1

, 당신은 다음, 자신이 NSURLConnection 같은 것을 사용하여 파일을 다운로드 XML 파서 로컬 파일 경로를 통과해야합니다.

+0

아니요, 진행률에는 관심이 없습니다. 완료 시점을 알아야하고 기본적으로 initWithContentsOfUrl이 동기식 또는 비동기식 NSURLConnection과 함께 작동하는지 여부에 관한 질문이 기본적으로 내려집니다. 이것이 실제로 동기이면, initWithContentsOfURL이 반환 된 후 다운로드가 완료되었다고 가정 할 수 있습니다 (아마). – pille

+0

동기식 방법으로 인해 GUI가 다시 그려지지 않으므로 GUI 업데이트 ('[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible : YES]')가 표시되지 않습니다. 이벤트 루프로 돌아갈 때까지 GUI가 다시 그려지지 않습니다. –

1

예, 차단됩니다. 그래서 당신의 활동 indocator가 표시되지 않습니다.