2010-12-27 3 views
0

iPhone 앱에서 온라인 데이터로 작업하려고합니다. 하지만이 때문에 화를 내고 있습니다.UITableView 재로드 데이터가 즉시 다시로드되지 않습니다.

NSURLConnection을 사용하여 데이터를 다운로드 할 개체가 있습니다. 별도의 스레드에서 연결 (및 다른 것들) 작업을 시작하는 메서드 - [ NSThread detachNewThreadSelector:@selector(doConnectionInNewThread) toTarget: self withObject: nil ];

데이터가로드 될 때 (connectionDidFinishLoading) 나는 그들에게 내 viewController 줄. 이 모든 것들이 잘 작동합니다. 중단 점이나 NSLog를 사용할 때 데이터를 UITableView에 표시 할 준비가되었습니다. reloadData를 호출하면 아무 일도 일어나지 않습니다. 어쩌면 2 초 후에 데이터를 다시로드합니다 (이 지연 후 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath이 호출됩니다).

그러나 tableView를 슬라이드하면 즉시 데이터가 다시로드됩니다. 그래서 연결 등등 잘 작동하지만 그냥 데이터를 다시로드하지 않습니다. 왜? URLConnection에 의해 mainThread가 막혀있을 수 있다고 생각했습니다. 하지만 지금은 별도의 스레드에서 사용하고 여전히 동일합니다 ...

답변

2

분리 된 스레드에서 테이블보기에 액세스하고 있습니까?

사용하여 주 스레드에서 UI를 업데이트해야합니다 :

-performSelectorOnMainThread : withObject : waitUntilDone :

+0

흠. 그래서 지금 연결 객체로 (분리 된 쓰레드가 아닌) 연결 객체로 객체 함수를 실행합니다. 그러나 필요한 모든 데이터를 얻을 때 "-performSelectorOnMainThread : withObject : waitUntilDone :"을 호출하여 viewController에 reloadData를 알리고 완벽하게 작동합니다. 감사합니다. 트릭이란 무엇입니까? 그 이름은 "인내심없이 mainThread에서 이것을하십시오"와 같은 것을 말합니다. 그래서 그것은 이전의 URLConnection 또는 무엇을 멈추게합니까? – D33

+0

비 주 스레드에서 UI 상태 시스템에 액세스하는 것은 일반적으로 지원되지 않습니다. 특히 reloadData는 테이블 뷰가 데이터를 다시로드하기 위해 디스플레이가 필요하다고 표시합니다 (즉, 데이터로드가 지연됨). 메인 스레드가 아니기 때문에 디스플레이 스케줄링이 잘못된 것 같습니다. – Julien

+0

적절한 잠금이없는 경우에도 백그라운드 스레드의 데이터를 표시 할 때 사용하는 동일한 콜렉션 (변경 가능한 배열 또는 사전)을 조작해서는 안됩니다. 하나의 스레드에서 NSMutableArray 또는 NSMutableDictionary에 객체를 추가하는 동안 다른 스레드에서 객체를 추가 할 수 없습니다. –

관련 문제