2012-06-03 141 views
0

我有处理设备地址簿的表,该表可以轻松地有500多个联系人。 除了表得到更新,每3秒钟,然后在每次更新运行代码有很多行的UITableView性能

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

,我更新的小区和一个图像(存在)的文本。 单元格的所有计算都是后台线程上的句柄。问题是大多数时候滚动不够流畅。 当我触摸表开始滚动然后滚动没有响应1秒左右(我认为是因为表刷新在这个时间)。

所以问题是如何处理非常长的表在短时间内获取数据并需要刷新?

回答

0

有一个简单的方法和正确的方法,但无论如何 - 不要重新加载行。通过[self.tableView cellForRowAtIndexPath:]获取单元格并更改它们的属性,这是第一个。然后,在桌面上执行强制更新。

什么是您的表的实际数据源?是NSFetchedResultsController?它是一些in-controller NSArray?无论如何,你只应该更新包含新数据的单元格。如果您使用CoreData,请使用NSFetchedResultsControllerDelegate方法。对于NSArray我建议KVO - 观察阵列中已更改的对象。

+0

我猜对于UITableView的工作原理存在误解。方法'cellForRowAtIndexPath'总是创建一个新的单元格(可能重复使用一个循环的单元格)。它永远不会返回现有的表。它只被'UITableView'调用。如果您自己调用它,则会创建一个永不显示的新表格单元格。 – Codo

+0

没有误解。在tableView之外调用'cellForForRowAtIndexPath'创建和显示循环为您提供现有单元格的引用,如果单元格已创建并显示。我同意,如果'indexPath'在'indexPathsForVisibleRows'数组内,这需要额外的检查。无论如何 - 如何在不重新加载行的情况下从NSFetchedResultsControllerDelegate方法(或任何其他更新方法)更新单元格的属性? –