在索引路径的行的单元格中,我从核心数据中获取信息,根据该数据更新单元格上的文本。
如果我的行数较少,则不会出现问题,但如果我有更多的单元格数(500行)则不顺利
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
MyRecord *record = [self fetchDataForIndexPath:indexPath.row]; //This is line which makes the table view scrolling un silky
cell.infolabel.text = record.name;
}
答案 0 :(得分:4)
将UITableView
绑定到核心数据获取请求时,您需要的工具是NSFetchedResultsController
。它将为您处理缓存,这是您的问题。当你不需要时,你几乎肯定会进行提取。您应该只在数据更改时重新获取数据。
如果您没有直接使用获取请求,那么您可以手动管理。在数据API前面创建一个对象,负责跟踪当前的可显示状态。此对象通常称为“视图模型”。有关此模式的一个很好的讨论,请参阅Introduction to MVVM。您的视图模型应该缓存最新获取的信息,这样您每次显示时都不会重新获取它。当底层模型发生变化时,就是通知表视图控制器某些单元需要更新的时间。
一个关键的考虑因素是你应该避免在像这样的大型表视图上调用reloadData
。 reloadData
指示表视图转储其自己的所有缓存并重新开始。只要有可能,您应该使用不那么激烈的方法,例如reloadRowsAtindexPaths:withRowAnimation:
,insertRowsAtIndexPaths:...:
,deleteRowsAtIndexPaths:...:
等。结合beginUpdates
,这是大型用户体验的关键部分表格视图。请参阅表视图编程指南中的"Batch Insertion, Deletion, and Reloading of Rows and Sections"。