Ios uitableview重载数据方法阻止uithread
我使用的是UITableView,它显示用户的联系人。对于一些联系人基数较大(5000多个联系人)的用户,tableview也有5000多行 在具有12k行的democase中,重载数据方法在设备上需要100ms 在这100毫秒中,仅“tableView:HeightForRowatineXpath:”就需要30毫秒,但实际上只是:Ios uitableview重载数据方法阻止uithread,ios,uitableview,Ios,Uitableview,我使用的是UITableView,它显示用户的联系人。对于一些联系人基数较大(5000多个联系人)的用户,tableview也有5000多行 在具有12k行的democase中,重载数据方法在设备上需要100ms 在这100毫秒中,仅“tableView:HeightForRowatineXpath:”就需要30毫秒,但实际上只是: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row>50)
{
return 47
}
return 62;
}
这是因为它被称为12000次
是否有加快速度的方法?除非您的单元格具有不同的高度或动态更改,否则只需设置大小,而不覆盖rowatinexpath的高度。这样做的主要目的是允许每个cel批次具有不同的尺寸,但需要花费时间。但是,如果您的单元格大小相同,它可以根据存储的值进行计算,而不是查询每个单元格并将其相加。为什么同时加载所有500个联系人?
如果速度变慢,只需加载前50个,如果用户滚动到底部,则加载下一个项目,依此类推。根据苹果的UITableView文档: “使用tableView:heightForRowAtIndexPath:而不是rowHeight会影响性能。每次 显示表格视图时,它将调用表格视图:heightForRowAtIndexPath: 在委托的每一行上,这可能会导致 表视图具有大量数据时存在严重的性能问题 行数(大约1000或更多)。” 我强烈推荐一种不同的实现,无论是将您的数据源限制在一个较小的数目,并且仅在需要时(即滚动)或其他方法来增加它
我刚刚创建了非常简单的类似代码,有20000行,在创建单元格和调用heightForRowAtIndexPath时记录,最初只创建了10个单元格,但是,在视图生成之前,所有20000个高度都被计算了两次。你确定重新加载数据需要那么长的时间,而不是数据源的实际重新加载吗?Tableview不会为所有重复使用的数据加载单元格。如何重新加载数据源?请查看文档中的tableView:EstimatedHeightForrowatineXpath:方法。它就是为了这个目的而添加到api中的。@Yan是的,我确信,因为我在instruments中检查了它。@rdelmar否,添加它是为了估计“复杂”的HeightForRowatineXpath调用,该方法仍然会为每个单元格调用,HeightForRowatineXpath也是如此。所以这对我没有帮助,因为我的HeightForRowatineXpath非常容易(只包含一个IF和两个returns)在CellForRowatineXpath中显示您的代码-我猜您没有正确地重用单元格…这并没有真正的帮助,因为这种情况下的问题发生在您向下滚动很远的时候。这也是不好的,因为当用户开始快速滚动时(这对于很长的表视图是可能的),再加载50个也没有帮助。嘿,谢谢在文档中找到它。我想我必须找到一种方法使我的细胞大小相同:/是的,这很糟糕,但如果我是你,我可能会这么做,特别是考虑到这两个细胞的大小非常接近(只有15个差异…)谢谢你的回答,我投了赞成票,因为你给出了正确的建议,但是@Mike实际上给了我苹果docu的引述和更详细的信息,所以我选择了他的答案。很抱歉