2014-06-11 47 views
0

我正在使用显示用户联系人的UITableView。对于一些拥有大量联系人的用户(5000+联系人),tableview也有5000多行。uitableview reloaddata方法阻塞uithread

具有〜12k行的democase中的reloadData方法在设备上需要100ms。

这些100毫秒时,作者“的tableView:heightForRowAtIndexPath:”本身就需要30毫秒,但实际上只是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.row>50) 
    { 
     return 47 
    } 
    return 62; 
} 

这是由于这样的事实,这就是所谓的1.2万倍。

无论如何加快这一点?

+0

你确定它的reloadData需要这么长时间,而不是实际重新加载数据源吗? Tableview不会为它重用的所有数据加载单元格。你如何重新加载数据源? – Yan

+1

查看文档中的tableView:estimatedHeightForRowAtIndexPath:方法。为了这个目的,它被添加到api中。 – rdelmar

+0

@Yan是的,我确定,因为我在乐器中检查过它。 –

回答

1

每苹果UITableView的文档:

“有使用的tableView性能影响:heightForRowAtIndexPath:对委托 :不是的rowHeight显示一个 表视图时,它都会调用的tableView:heightForRowAtIndexPath它的每一行都可能导致 显着的性能问题,并且表视图的行数很大(大约为1000或更多)的数目为 。

我强烈推荐一个不同的实现,无论是限制你的数据源为一个较小的数字,只在需要时(即滚动)或其他方法增加它。

我刚刚创建非常简单的类似的代码20000行和被造细胞,当heightForRowAtIndexPath叫,只有10细胞最初被创造记录,但计算全部20000个高度TWICE前这个看法甚至产生了。

+0

嘿,thx找到在文档中。我想我必须找到一种方法使我的细胞具有相同的尺寸:/ –

+0

是的,这很糟糕,但如果我是你,尤其是考虑到两个细胞的大小非常接近(只有15个区别.. 。) – Mike

1

除非您的单元格具有不同的高度或动态更改只是设置大小并且不覆盖heightForRowAtIndexPath。这样做的主要目的是让每个细胞批次的大小不同,但花费时间。但是如果你的单元格大小相同,它可以根据存储的值简单地计算出来,而不是查询每个单元格并将它们相加。

+0

感谢你的回答,我给你投了正确的建议后投了票,但@Mike实际上给了我苹果的文件和更详细的信息报价,因此我选择了他的答案。抱歉! –

0

为什么要同时加载所有500个联系人? 如果它慢,只需加载前50个,如果用户滚动到底部加载下一个项目等等。

+0

这并没有什么帮助,因为在这种情况下,问题会发生在你非常非常地滚动时。这也是不好的,因为当用户开始非常快速的滚动(这可能是非常长的tableviews)加载50多个不会帮助。 –