我正在尝试模拟 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/