insertRowsAtIndexPaths在tableView中的endUpdates上崩溃:willDisplayCell:forRowAtIndexPath仅在用户快速滚动时崩溃

时间:2011-10-13 07:57:24

标签: iphone uitableview core-data

正如标题所暗示的那样,当用户滚动到列表底部时,我试图在uitableview中插入更多行。完整的原因是由于性能原因而懒得加载数据,而且数据集很大。

奇怪的是,如果我慢慢滚动然后它工作正常,但如果我快速滚动然后它在[tableView endUpdates];上崩溃

数据源是一个nsmutablearray,它使用常见的fetchRequest从coredata加载数据。在我目前的情况下,我无法使用fetchedResultsController。

在调用insert之前和之后,数据源计数是正确的。行计数(和数据源计数)是正确的。

如果我慢慢滚动,稍后在某个点滚动快速,它会崩溃,索引超出边界时通常会出现相同的错误,但是当tableview为时,错误消息中的索引和边界与原始计数不一致第一个绑定(在任何插入发生之前)。行数为4,数据源数为4&等

这是错误:

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

我也尝试在cellForRowAtIndexPath方法中插入行,但结果相同。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这不是解决大型数据集滚动问题的正确方法。

  1. UITableView的目的是在任何时候只在内存中保留少量单元格。
  2. 在滚动时尝试获取数据将会非常糟糕,因为磁盘访问速度明显慢于UI更新。
  3. 相反,您应该考虑在从Core Data获取数据时限制批量大小。其次,您还应该针对您的应用程序运行工具并确认热点位置。滚动或细胞群是极不可能的慢点。

    BTW,NSMutableArray在处理Core Data的结果时很少有用。除非您有特定原因要求NSMutableArray,否则您应该将其更改为NSArray

答案 1 :(得分:0)

在应用程序启动时预先填充NSMutableArray吗?目前我假设您使用控制器对象作为UITableViewDelegate只返回最终行数,而NSMutableArray在您移动时会被填满?

在这种情况下,如果加快滚动速度,从Core Data加载可能会太慢,导致数组中出现“漏洞”。