滚动到TableView的最后一个元素需要花费太多时间

时间:2017-01-02 07:25:59

标签: ios swift xcode uitableview

我试图模拟Whatsapp Chat任何单元格都会有一个图像(对于气泡的尾部),一个只有View的颜色和一些角半径的气泡以及一个代表该文本的标签消息。

我在通话前后打印了

self.messagesTableView.reloadData()

一旦打印完毕后,tableView会保留一些时间,我不知道在显示数据之前是什么。在indexpath处的Insert行也是如此,显示插入动画需要一些时间。

func displayMessages(viewModel: GroupChatMessages.GetChatMessages.ViewModel) {
    let displayedMessage = viewModel.displayedMessages

    print ("i'm here!")

    messages = displayedMessage!

    //self.messagesTableView.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)

    self.messagesTableView.reloadData()

    print ("i'm here2!")

    firstTime = false
    self.setVisible(hiddenTableView: false, hiddenChatLoader: true)
    self.scrollToLastMessage(false)
    self.messagesLoaded = true

}

我已尝试使用队列调度,并在reloadData()之前使用注释行,但nothings无效并且没有任何代表有意义的时间。

也许可能是泡沫的形象?我不知道。我将此图像保存在Assets上,因此我不会从互联网上下载。

self.setVisible只是隐藏加载器并显示tableView但我已经尝试过移动它并且没有改变。您需要的任何进一步信息让我知道。谢谢!

修改

我已经看到问题来自滚动到最后一个单元格,这是大部分时间需要的地方。

 func scrollToLastMessage(animated: Bool) {
    let section = 0
    let lastItemIndex = self.messagesTableView.numberOfRowsInSection(section) - 1
    let indexPath:NSIndexPath = NSIndexPath.init(forItem: lastItemIndex, inSection: section)
    self.messagesTableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: animated)
    self.scrollDownButton.hidden = true
}

有一个优化滚动的可能性,因为我必须做一个滚动,因为一旦加载数据,我看到的第一行是tableView的顶行,但我想看到底部最后一个)。谢谢!

2 个答案:

答案 0 :(得分:1)

reloadData()这样的方法应该被视为UI方法,并且必须在主线程中调用它们:

DispatchQueue.main.async { tableView.reloadData() }

最好不要使用reloadData()函数,除非需要刷新大量单元格或更改数据源,而是使用此方法添加新行:

tableView.insertRows(at: [IndexPath], with: UITableViewRowAnimation)

并刷新细胞:

tableView.reloadRows(at: [IndexPath], with: UITableViewRowAnimation)

如果单元格有大量图像和渲染,请使用此代码使滚动更快:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
    // ADD THESE TWO LINE
    cell.layer.shouldRasterize = true
    cell.layer.rasterizationScale = UIScreen.main.scale
}

使用这些方法可显着提高加载速度

答案 1 :(得分:1)

最后我发现的解决方案可以避免在等待任何一次滚动到最后一个元素时死亡,是交换表的方向

tableView.transform = CGAffineTransformMakeRotation(-M_PI); cell.transform = CGAffineTransformMakeRotation(M_PI);

现在 headerView和footerView被颠倒。例如,如果您希望使用此配置在TableView底部(视觉上)插入行,则应将其添加到位置0 forRow:0 atSection:“WhereYouAre”。这样,当您添加新元素时,不需要滚动,因为自动滚动。惊人而奇怪的回答恕我直言。

我在这里找到了这个解决方案:

Solution Link

@Christos Hadjikyriacou在那里解决了。