uitableview reloaddata方法阻止uithread

时间:2014-06-11 15:37:42

标签: ios uitableview

我正在使用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次。

反正有加速吗?

3 个答案:

答案 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个,如果用户滚动到底部加载下一个项目,依此类推。