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

标签 ios swift xcode uitableview

我正在尝试模拟 Whatsapp 聊天,任何单元格都会有一个图像(用于气泡的尾部),一个气泡,它只是带有颜色的 View 和一些角半径,以及一个将代表消息文本的标签。

我在通话前后打印了一张

self.messagesTableView.reloadData()

一旦 after print 被调用,tableView 就会保留一些时间点,直到显示数据我才知道是什么。 Insert row at indexpath 也会发生同样的情况,需要一些时间才能显示插入动画。

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() 之前的注释行进行分派(dispatch),但没有任何效果,也没有任何代表有意义的时间。

也许是为了泡沫的形象?我不知道。我将这张图片保存在 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 的顶行,但我想看到底部的(最后的)。谢谢!

最佳答案

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
}

使用这些方式将显着提高加载速度

关于ios - 滚动到 TableView 的最后一个元素需要太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422841/

相关文章:

swift - 用户可以从您的 Xcode 项目访问哪些文件/数据 - Swift 4

iphone - APNS 只能通过命令行工作

ios - Xcode 可执行文件使用无效权利签名

ios - Tableview 中的文本字段在 iOS 9 和 iOS10 上的行为有所不同

ios - Core Data 多项编辑效率与随机误差

swift - #AudioKit 无法在 Xcode 14.1、Maverick 上添加包

ios - 准备 segue,传递数据

objective-c - 如何在第三方音乐应用程序中获取正在播放的信息?

ios - 为什么当我点击推送通知并快速移动 ViewController 时状态栏消失

ios - 如何在不调用 viewdidload 的情况下第二次显示我的 View Controller ?