我正在使用UITableView来显示用户联系人。对于一些拥有大型联系人(5000多个联系人)的用户,tableview也有5000多行。
在大约12k行的democase中的reloadData方法在设备上需要100ms。
在这100ms中,'tableView:heightForRowAtIndexPath:'单独需要30ms,但实际上只是:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row>50)
{
return 47
}
return 62;
}
这是因为它被称为12,000次。
反正有加速吗?
答案 0 :(得分:1)
除非您的单元格具有不同的高度或动态更改,否则只需设置大小并且不要覆盖heightForRowAtIndexPath。其主要目的是允许每个cel批次的大小不同,但需要花费时间。但是如果您的单元格大小相同,则可以根据存储的值进行计算,而不是查询每个单元格并将其相加。
答案 1 :(得分:1)
Per Apple的UITableView文档:
“使用tableView有高级性能:heightForRowAtIndexPath:而不是rowHeight。每次a 显示表视图,它调用tableView:heightForRowAtIndexPath: 在每个行的委托上,这可能导致一个 表视图具有大量的重要性能问题 行(大约1000或更多)。“
我强烈推荐一种不同的实现方式,无论是将数据源限制为较小的数字还是仅在需要时(即滚动)或其他方法进行扩充。
我刚刚创建了非常简单的类似代码,包含20,000行,并在创建单元格时调用,并在调用heightForRowAtIndexPath时记录,最初只创建了10个单元格,但 所有20,000 在生成视图之前,计算高度 TWICE 。
答案 2 :(得分:0)
为什么要同时加载所有500个联系人? 如果它要慢,只需加载前50个,如果用户滚动到底部加载下一个项目,依此类推。