Swift - UITableView 滚动到底部很慢

Posted

技术标签:

【中文标题】Swift - UITableView 滚动到底部很慢【英文标题】:Swift - UITableView scroll to bottom is slow 【发布时间】:2016-02-15 11:46:31 【问题描述】:

问题

滚动到表格视图的底部很慢 表格视图包含大约 25 个项目 并且创建每个单元都有一些复杂性 所以同时创建 25 个需要大约 200 毫秒(相信我,我无法让它更优化)

我尝试过的解决方案

基本上有两个选项可以滚动到表格视图的底部(我已经在整个堆栈中搜索了这个)

    tableView.scrollRectToVisibletableView.setContentOffset tableView.scrollToRowAtIndexPath

第一个选项的问题是,虽然它非常快并且它不会重新创建从 tableView 的顶部到底部的每个单元格,但我需要调用一个新的主队列以使其工作。如果我在与调用tableView.reloadData() 的队列相同的队列中调用它,那么滚动tableview 时会出现奇怪的延迟(日志显示许多单元格被不必要地重新创建,我的意思是很多)。让我补充一点,两个线程都是主线程。但我仍然必须拨打dispatch_get_main_queue() 来摆脱尴尬的延迟。然而,新的主线程为初始加载增加了很好的延迟。 这是我的代码:

func loadData(groupID: String)
    self._chats = self._cache[groupID]!
    _tableView.reloadData()
    dispatch_async(dispatch_get_main_queue()) 
        let rect = CGRect(x: 0, y: self._tableView.contentSize.height - self._tableView.bounds.height, width: self._tableView.contentSize.width, height: self._tableView.bounds.height)
        self._tableView.scrollRectToVisible(rect, animated: false)
    

再次,如果我不使用 dispatch_get_main_queue(),tableView 将会非常滞后。如果我确实使用它,那么执行中会有大约 100 毫秒的延迟,这会使初始加载速度变慢。

第二个选项也很慢,因为滚动到最后一个 indexPath 意味着在途中创建每个单元格。这不可能在后台发生,在主线程中执行意味着将 UI 冻结大约 200 毫秒。

您能否提出任何其他解决方案或发现我正在做的事情有问题?我已经尝试了所有方法,但 tableView 仍然不够快。

【问题讨论】:

believe me there is no way I can make it any more optimised - 前提是您向我们证明... 为什么要重新加载表格视图然后想滚动到底部? @Wain 这是一个消息应用程序,每个消息气泡都有很多细节,如日期、用户缩略图等。它非常复杂,我尝试对其进行优化,但运气不佳。 @Wain 有没有办法滚动到底部然后添加项目?这不会让我回到最高位置吗? 所以你可能应该问你的问题,并显示代码。为什么要完全重新加载表格? 【参考方案1】:

您可以使用 Xcode Instruments 之一的 Time Profiler 来了解您的应用堆栈在哪个进程上。

【讨论】:

以上是关于Swift - UITableView 滚动到底部很慢的主要内容,如果未能解决你的问题,请参考以下文章

检测 UITableView 何时滚动到底部

在 UITableView 中滚动到顶部后,CAGradientLayer 位置错误。迅速

启动 UITableView 滚动到底部

uitableview 不会滚动到底部

UITableView 从当前位置滚动到底部

iOS UITableView如何禁用滚动到底部弹跳