我有UITableView
个约500件。
当我调用tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)
时,主UI线程被阻止了3秒钟。
有没有办法解决这个问题?或滚动500项问题?
由于
问题与reloadData
scrollToRow
无关
答案 0 :(得分:2)
从讨论如何使用表格视图进行聊天: 我们可以使用表格视图,它使用变换来翻转Y坐标。然后我们需要为每个单元格做同样的操作,这样它们就不会颠倒过来。
该过程是构建一个正常的消息传递表视图,其中最新消息位于顶部(而不是底部)。然后将表视图放在某个超视图上并反转其坐标系:
chatContainer?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0)
包含消息的单元格还应该包含需要翻转的所有内容的某种超级视图:
override func awakeFromNib() {
super.awakeFromNib()
containerView?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0)
}
因此,细胞基本上翻转两次,以便正确显示。
您可以找到示例项目here。
答案 1 :(得分:0)
使用时间分析器确定问题的确切位置。问题是,UITableView
性能通常不会受到加载的大量项目的影响。视图本身将加载尽可能多的项目以填充整个屏幕。
您可以通过在cellForRowAtIndexPath
中记录方法来对此进行测试。所以我猜这个方法可能很慢。检查如何从中访问数据,可能有一些重要的逻辑。或者单元格布局可能会被窃听并且非常慢。
在一般情况下,如果您有非常大量的数据,请考虑使用核心数据和专为此情况设计的NSFetchedResultsController
。但是请注意,在表视图中加载500个元素应该可以顺利运行,无需任何特殊优化。
答案 2 :(得分:0)
我对此解决方案并不是100%肯定,我自己也没有遇到过这个问题。 也许只是派遣它?
extension UITableView {
func tableViewScrollToBottom(animated: Bool) {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
let numberOfSections = self.numberOfSections
let numberOfRows = self.numberOfRows(inSection: numberOfSections-1)
if numberOfRows > 0 {
let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
self.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: animated)
}
}
}
}