【问题标题】:How to determine the reason of low performance of a UITableView如何确定 UITableView 性能低下的原因
【发布时间】:2016-06-30 08:40:03
【问题描述】:

我有一个UITableView 作为我的应用程序的主要视图。这个UITableView 的内容是通过HTTP 请求作为JSON 从Web 加载的,一次5 项。此请求部分没有性能问题。

之后,将根据 JSON 数据的内容以编程方式生成单元格。例如,如果 JSON 表示一个单元格包含 1 个UILabel、1 个UITextField 和 1 个UIButton。我将这些添加为子视图以纠正UITableViewCell。细胞的初始状态也没有问题。

当您向下滚动时,会从 Web 加载新项目,这是触发“加载更多”功能的方法。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let lastElement = data.jsonArray.count - 2
    if indexPath.row == lastElement {
        page += 1
        getFeed()
    }
}

但是,当您向下滚动时,您会注意到小的冻结和滞后,这看起来很糟糕。我不知道为什么会出现这些小冻结。

这就是现在的样子。我是在模拟器上录的,但在真机上就差很多了。

我不知道我应该在这里做什么。有什么建议吗?谢谢。

【问题讨论】:

  • 你能把代码贴在cellForAtIndexPath:吗?
  • 它很长很复杂。
  • getFeed 会在用户经常滚动到最后一个索引时调用多次。如果方法已经在执行,你应该阻止调用它。
  • 好的!您可以通过以下方式找到导致性能不佳的原因:删除cell forRowAtIndexPath:中的所有业务代码,然后再次查看性能。如果性能仍然不好,那是因为cornerRadius,gradient,autolayout,...问题。否则,问题是因为您的业务代码持有主线程太久。您可以逐行取消注释代码,直到发现问题为止!
  • 似乎向单元格添加视图会导致性能问题。我目前从 cellforRowAtIndexPath 开头的单元格中删除所有子视图,然后添加它们。这是一种不好的方法吗?

标签: ios objective-c swift uitableview


【解决方案1】:
  • 当您从服务器获取每个单元格的数据时,它总是会滞后。对于 使体验更流畅,您需要在其中获取 10-15 个 JSON 对象 提前并将它们存储在数组中。每当您提出新请求时添加 数组中的那些对象。
  • 因此,您不会为每个单元发出服务请求,而是发出 在 10-15 个单元格之后请求(如果您的 json 对象包含较少的字段)。您可以在底部显示微调器 提出新的要求。
  • 为此还需要在服务器端做机制给你 10-15 数组中的对象

这种机制也称为分页

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ( (indexPath.row == array.count - 1)) {
        // This is the last cell
        [self loadMore];
    }
}

// Load more
- (void)loadMore {

     //make service request for next page (Make sure your response contains next 10 objects)
     //on response add those objects in the array
     //reload table view
    [self.tableView reloadData];
}

【讨论】:

  • 对不起,我的问题不清楚,我实际上一次取 5 个项目。
  • 您也可以在 5 个对象上设置此方法。请编辑您的问题以获得更好的清晰度
  • 我从我的单元格中删除了所有视图,只留下了分页方法。似乎它们工作正常并且不影响性能。问题可能是如何将视图添加到单元格中。
  • 这是一个很长的方法,但在开始时,我从单元格中删除了所有视图,然后重新开始添加它们。
  • 这意味着您每次都在分配新视图,而没有利用出队功能。出队所做的是每次都从分配新对象中节省下来。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多