2011-10-13 1 views
0

제목에서 알 수 있듯이 사용자가 목록의 맨 아래로 스크롤 할 때 더 많은 행을 uitableview에 삽입하려고합니다. 전체적인 이유는 대규모 데이터 세트로 인해 성능상의 이유로 데이터를 지연로드하는 것입니다.사용자가 빠르게 스크롤하는 경우에만 tableView : willDisplayCell : forRowAtIndexPath의 endUpdates에서 insertRowsAtIndexPaths가 충돌합니다.

이상한 것은 내가 천천히 이동하면 그때는 잘 작동한다는 것입니다,하지만 난 빠르게 스크롤하면 다음은 데이터 소스는 공통 fetchRequest를 사용하여, coredata에서 데이터를로드하는있는 NSMutableArray이다 [tableView endUpdates];

에 충돌합니다. 현재 상황에서는 fetchedResultsController를 사용할 수 없습니다.

데이터 소스 수는 삽입이 호출되기 전과 후에 정확합니다. 행 수 (및 데이터 소스 수)가 정확합니다.

천천히 스크롤하고 나중에 일부 지점에서 스크롤하면 충돌이 발생합니다. 일반적으로 인덱스와 경계가 경계를 벗어나는 것과 동일한 오류가 발생하지만 오류 메시지의 인덱스와 경계는 테이블 뷰 처음 바인딩되었습니다 (삽입이 발생하기 전에). (4) 즉, 행 카운트 4 & 등

이러한 소스 카운트 오류이다

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 

제가 또한 cellForRowAtIndexPath 방법 중하지만 동일한 결과 행을 삽입 시도.

아이디어가 있으십니까?

답변

3

큰 데이터 세트 스크롤 문제를 해결하는 올바른 방법이 아닙니다.

  1. UITableView은 한 번에 메모리에 적은 수의 셀만 유지하도록 설계되었습니다.
  2. 스크롤하는 동안 데이터를 가져 오려고하면 디스크 액세스가 UI 업데이트보다 상당히 느리므로 매우 효과적입니다.

대신 코어 데이터에서 데이터를 가져올 때 배치 크기를 제한하는 것을 고려해야합니다. 또한 2 차적으로 앱에 대해 계측기를 실행하고 핫스팟이 어디에 있는지 확인해야합니다. 스크롤링이나 세포 집단이 느린 점일 가능성은 희박합니다.

BTW의 경우 NSMutableArray은 Core Data의 결과를 처리 할 때 거의 유용하지 않습니다. NSMutableArray의 특별한 이유가있는 경우가 아니면 NSArray으로 변경해야합니다.

+0

더 많은 행을 삽입하는 코드는 코어 데이터에서 일괄 처리를 수행하고 있습니다. 테이블 뷰는 정상적인 동작에 따라 셀을 재사용하므로 메모리의 셀 수가 문제가되어서는 안됩니다. 그러나이 경우에는 nsmutablearray가 이상적이지 않다는 귀하의 권리가 필요합니다. Btw 나는로드되는 행의 수가 한 번에 10 개이고 기존 행의 수가 10임을 언급해야합니다. 어떤 tableview가 쉽게 표시 할 수 있어야합니다. – Rob

+0

tableview 셀은 기본 셀뿐 아니라 셀 텍스트를 행 인덱스로 설정하여 원인을 확인했지만 차이는 없습니다. 계측기에서는 앱이 다운 될 때까지 메모리 또는 프로세서 사용량에 대한 핫스팟을 볼 수 없었습니다. – Rob

+2

다시 이것은 올바른 접근 방식이 아닙니다. 모든 데이터를로드하고 코어 데이터가 배치 크기를 사용하여 데이터의 흐름을 제어하게합니다. 핵심 데이터는 객체 참조를 다시 제공하지만 모든 데이터에로드하지는 않지만 데이터를 캐시하므로 앱 성능이 좋습니다. 이 작업을 시도하기 전에 성능을 ** 테스트 ** 했습니까? 이 * 정말 * 수영 업스트림으로 건너 온다. 나는 tableview/coredata가 문제없이 수천 개의 행을 처리하는 것을 보았습니다. –

0

NSMutableArray은 응용 프로그램 시작시 미리 채워 졌습니까? 현재 나는 이 이동하면서 채워지는 동안 최종 행 수만 반환하는 UITableViewDelegate으로 컨트롤러 객체를 사용한다고 가정합니다.

그런 경우 스크롤 속도를 높이면 배열에 "구멍"이 생기며 코어 데이터로드가 너무 느릴 수 있습니다.

+0

예보기 컨트롤러가로드 될 때 nsmutablearray가 채워지지만 (작은 배치의 데이터 만 사용하여) nsmutablearray 개수가 현재 배치의 전체 행 수에 사용됩니다. 사용자가 스크롤하고 마지막 행이 표시되면 다른 배치가 검색되어 nsmutablearray에 추가됩니다. 전체 합계는 알 수 없으며 잠재적으로 무한 할 수 있습니다. – Rob

관련 문제