索引路径处的行的单元格延迟

时间:2014-12-15 14:59:41

标签: objective-c uitableview grand-central-dispatch

在索引路径的行的单元格中,我从核心数据中获取信息,根据该数据更新单元格上的文本。

如果我的行数较少,则不会出现问题,但如果我有更多的单元格数(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;
}

1 个答案:

答案 0 :(得分:4)

UITableView绑定到核心数据获取请求时,您需要的工具是NSFetchedResultsController。它将为您处理缓存,这是您的问题。当你不需要时,你几乎肯定会进行提取。您应该只在数据更改时重新获取数据。


如果您没有直接使用获取请求,那么您可以手动管理。在数据API前面创建一个对象,负责跟踪当前的可显示状态。此对象通常称为“视图模型”。有关此模式的一个很好的讨论,请参阅Introduction to MVVM。您的视图模型应该缓存最新获取的信息,这样您每次显示时都不会重新获取它。当底层模型发生变化时,就是通知表视图控制器某些单元需要更新的时间。

一个关键的考虑因素是你应该避免在像这样的大型表视图上调用reloadDatareloadData指示表视图转储其自己的所有缓存并重新开始。只要有可能,您应该使用不那么激烈的方法,例如reloadRowsAtindexPaths:withRowAnimation:insertRowsAtIndexPaths:...:deleteRowsAtIndexPaths:...:等。结合beginUpdates,这是大型用户体验的关键部分表格视图。请参阅表视图编程指南中的"Batch Insertion, Deletion, and Reloading of Rows and Sections"