2012-06-03 5 views
0

나는 장치 addressBook을 처리하는 테이블을 가지고 있는데, 그 테이블은 쉽게 500+ 접촉을 가질 수있다. 또한 테이블은 매 3 초를 업데이트받을 후 모든 갱신에 코드많은 행을 가진 UITableView 성능

[tableContacts beginUpdates]; 
[tableContacts reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationNone]; 
[tableContacts endUpdates]; 

을 실행 , 나는 셀과 하나 개의 이미지 (존재)의 텍스트를 업데이트합니다. 셀에 대한 모든 계산은 백그라운드 스레드의 핸들입니다. 문제는 대부분 스크롤이 원활하지 않다는 것입니다. 그리고 내가 스크롤을 시작하기 위해 테이블을 터치하면 스크롤이 1 초 정도 (이 시간에 테이블이 상쾌하기 때문에) 생각하지 않습니다.

그래서 짧은 시간에 데이터를 가져 와서 새로 고쳐야하는 매우 긴 테이블을 어떻게 처리해야합니까?

답변

0

쉬운 방법과 올바른 방법이 있지만 어쨌든 - 행을 다시로드하지 마십시오. [self.tableView cellForRowAtIndexPath:]을 통해 셀을 가져 와서 해당 속성을 변경하십시오. 그런 다음 테이블에 대한 강제 업데이트에 대해 수행하십시오.

테이블의 실제 데이터 소스는 무엇입니까? NSFetchedResultsController입니까? 일부 컨트롤러에 있나요? NSArray? 어쨌든 새 데이터가있는 셀만 업데이트해야합니다. CoreData를 사용하는 경우 NSFetchedResultsControllerDelegate 메소드를 사용하십시오. NSArray의 경우 KVO를 제안합니다. 어레이에서 변경된 객체를 관찰합니다.

+0

'UITableView'가 어떻게 작동하는지에 대한 오해가 있습니다. 'cellForRowAtIndexPath' 메서드는 항상 새로운 셀을 생성합니다 (아마도 재활용 된 셀을 재사용 할 수도 있습니다). 기존 테이블을 반환하지 않습니다. 그것은'UITableView'에 의해서만 호출됩니다. 직접 호출하는 경우 표시되지 않는 새 표 셀을 만듭니다. – Codo

+0

오해가 없습니다. tableView create & display cycle 외부에서'cellForForRowAtIndexPath'를 호출하면 셀이 생성되어 표시되면 기존 셀에 대한 참조가 제공됩니다. 나는'indexPaths'가'indexPathsForVisibleRows' 배열 내에 있으면 추가 체크가 필요하다는 것에 동의합니다. 어쨌든 - 행을 다시로드하지 않고 NSFetchedResultsControllerDelegate 메소드 (또는 그 밖의 다른 업데이트 메소드)에서 셀의 속성을 어떻게 업데이트합니까? –

관련 문제