Swift - UITableView 滚动到底部很慢
Posted
技术标签:
【中文标题】Swift - UITableView 滚动到底部很慢【英文标题】:Swift - UITableView scroll to bottom is slow 【发布时间】:2016-02-15 11:46:31 【问题描述】:问题
滚动到表格视图的底部很慢 表格视图包含大约 25 个项目 并且创建每个单元都有一些复杂性 所以同时创建 25 个需要大约 200 毫秒(相信我,我无法让它更优化)
我尝试过的解决方案
基本上有两个选项可以滚动到表格视图的底部(我已经在整个堆栈中搜索了这个)
tableView.scrollRectToVisible
或 tableView.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 滚动到底部很慢的主要内容,如果未能解决你的问题,请参考以下文章