如何确定UITableView性能低下的原因

3
我有一个UITableView作为我的应用程序的主视图。该UITableView的内容通过JSON的HTTP请求从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()
    }
}

然而,在向下滚动时,您会注意到小的冻结和卡顿,这看起来非常糟糕。我不知道为什么会出现这些小的冻结。
这是目前的情况。我在模拟器上录制了这段视频,但在实际设备上会更糟糕。
我不知道我应该在这里做什么。有什么建议吗?谢谢。

1
你能在 cellForAtIndexPath: 中发布代码吗? - Proton
这非常长而且复杂。 - The Cook
当用户经常滚动到最后一个索引时,getFeed 方法将被多次调用。如果该方法已经在执行中,则应防止再次调用。 - MD.
好的!你可以通过以下方式找到导致性能不佳的原因:在 cell forRowAtIndexPath: 中删除所有业务代码,然后重新检查性能。如果性能仍然不佳,则可能是因为圆角半径、渐变、自动布局等问题。否则,问题可能是由于你的业务代码占用了主线程太长时间。你可以逐行取消注释代码,直到找到问题所在! - Proton
似乎将视图添加到单元格中会导致性能问题。我目前在cellforRowAtIndexPath的开始处删除所有子视图,然后再添加它们。这是一种不好的做法吗? - The Cook
您可以使用Xcode中提供的剖析工具来确定代码的低性能。 - pronebird
1个回答

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个项目。 - The Cook
你也可以将这种方法应用于5个对象。请修改您的问题以获得更好的清晰度。 - Rohit Pradhan
我从我的单元格中删除了所有视图,只留下了分页方法。看起来它们工作得很好,不会影响性能。问题可能是如何将视图添加到单元格中。 - The Cook
这是一个非常长的方法,但在它的开头,我会先从单元格中移除所有视图,然后再开始重新添加它们。 - The Cook
这意味着您每次都在分配新视图,而没有利用出队功能。出队所做的就是避免每次分配新对象。 - Rohit Pradhan
我的单元格的非静态结构怎么做到这一点? - The Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接