Swift - UITableView滚动到底部很慢

时间:2016-02-15 11:46:32

标签: ios swift uitableview

问题

滚动到表格视图的底部很慢 表视图包含大约25个项目 并且创建每个单元格有点复杂 因此,同时创建其中的25个大约需要200毫秒(相信我,我无法再进行任何优化)

我尝试过的解决方案

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

  1. tableView.scrollRectToVisibletableView.setContentOffset
  2. tableView.scrollToRowAtIndexPath
  3. 第一个选项的问题是,尽管它非常快并且它没有从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还不够快。

1 个答案:

答案 0 :(得分:0)

您可以使用Xcode Instruments之一的Time Profiler来了解您的应用堆栈的哪些流程。