0

XML을 다운로드하여 UITableView를 작성하는 데 사용 된 배열을 채 웁니다. 다른 말로 알릴 때까지는 테이블에 표시하기 전에 배열을 완전히 다운로드해야한다고 생각합니다 (텍스트가 매우 작기 때문에 가능한 가장 느린 연결에서 적절한 시간에 다운로드 함). 가장 느린 속도로 3-5 초 정도 걸리므로 다운로드하는 동안 상태 표시 줄에 활동 표시기를 표시하는 것이 좋습니다.SYNCHRONOUS 다운로드를 수행하는 동안 UIActivityIndicator 표시

은 내가 아무것도하기 전에 (내가 모든 것을 완료 한 후 다음을 해제) ... 호출에 ...

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 

을하지만, 그것은 단지 나타나고 최소 금액에 대해에 종료 인간의 눈에 보이게하는 밀리 초의 시간.

이 경험이있는 이유에 대한 제안 사항이 있으십니까?

감사합니다. Z @ K!

답변

1

나를위한 쉬운 대답은 GCD, Grand Central Dispatch였습니다. 나는 거의

self.table_array = [self.webQuery downloadAndParseXMLForTable]; 
[(UITableView *)self.view reloadData]; 

* webQuery가 다운로드 및 웹에서 XML 데이터를 구문 분석하는 사용자 지정 개체입니다 ... 모든 내 코드 ...

내 코드는 다음과 같이 시작을 수정했다. ** downloadAndParseXMLForTable은 XML 파일을 동기식으로 다운로드하고 구문 분석 한 다음 (NSArray *) 개체를 반환하여 테이블보기를 지원하는 사용자 지정 메서드입니다.

아래 수정 된 코드는 GCD를 채택하고 UI를 응답 성있게 유지해야하는 유일한 변경 사항을 보여줍니다.

dispatch_queue_t table_download_queue = dispatch_queue_create("com.yourcompany.queuename", NULL); 

dispatch_async(table_download_queue, ^{ 
    self.table_array = [self.webQuery downloadAndParseXMLForTable]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [(UITableView *)self.view reloadData]; 
    }); 
}); 

dispatch_release(table_download_queue); 

그게 전부 야! 나는 이것이 나의 곤경에 처한 다른 사람들을 돕기를 희망한다 ...

건배, Z @ K!

경고 : WWDC 2010에서 GCD가 현재 SECURE 전송을 지원할 수 없다고 언급되었습니다. 세부 사항은 기억이 나지 않지만 연사 인 퀸 (Quinn)은 그것에 대해 매우 단호했습니다. 나는 그가 제안한 프로세스가 NSOperation을 필요로한다고 생각한다 ...

1

동기화 다운로드는 호출 스레드에서 수행되고 완료 될 때까지 스레드를 차단합니다. 이는 UI와 동일한 스레드에서 수행됩니다. 다운로드가 완료 될 때까지 스레드가 차단되므로 활동 표시기가 보이지 않거나 다운로드가 완료 될 때까지 표시되고 이동하지 않습니다.

동기식 다운로드를 별도의 스레드에 넣거나 NSURLConnection : initWithRequest (다중 스레드)를 사용하여 App이 예상대로 응답하도록해야합니다.

+0

다운로드를 별도의 스레드에 넣으면 완료된 다운로드를 기다리는 테이블 뷰를 어떻게 만들려고합니까? 그러면 정확한 정보를 표시 할 수 있습니까? – Zak

+0

동기식 다운로드를 사용하는 경우 전체 힙은 다운로드가 완료되어 [tableview reloadData]를 제거하거나 initWithFrame을 사용하여 해당 인스턴스에서 실제로 UITable을로드하면 기본 스레드로 다시 콜백합니다. 가장 쉬운 방법은 대부분의 사람들이 NSURLConnection : initWithRequest를 사용하고 connectionDidFinishLoading : connection delegate 메서드에서 activityIndicator를 숨기고 테이블을 다시로드하는 방식이라고 생각합니다. – Rudiger

+0

콜백 구현 방법을 확장 할 수 있습니까?비동기 적으로 데이터를 다운로드한다는 생각이 맘에 들지만, 주 스레드를 차단하지 않고 테이블을 "정상적으로"동작시키는 방법을 모르겠습니다. – Zak

관련 문제