滚动时表格视图批处理的更新

问题描述

我已经为表格视图建立了分页机制,因此当用户滚动到该部分的最后一行时,应用程序会尽可能加载其他内容。加载其他内容后,我将在表视图上执行批量更新,如下所示:

guard
    let sectionIndex = self.sections.firstIndex(of: .itemsSection),!loadedItems.isEmpty
else { break }

let prevIoUsNumberOfRows = self.tableView.numberOfRows(inSection: sectionIndex)
let additionalIndexPaths = self.generateIndexPaths(
    startIndex: prevIoUsNumberOfRows,count: loadedItems.count,section: sectionIndex
)

self.tableView.performBatchUpdates({
    self.items.append(contentsOf: loadedItems)
    self.tableView.insertRows(at: additionalIndexPaths,with: .automatic)
},completion: nil)                    

这是一个生成索引路径以在以下位置插入新行的函数

private func generateIndexPaths(startIndex: Int,count: Int,section: Int) -> [IndexPath] {
    var indexPaths: [IndexPath] = []
    for row in startIndex..<startIndex + count {
        indexPaths.append(IndexPath(row: row,section: section))
    }
    return indexPaths
}

它很好用,直到在滚动表视图时发生更新为止。附加内容的加载速度如此之快,以至于滚动动画没有时间完成。它开始跳跃,其他单元格随着动画破裂弹出。由于我的表格视图使用UITableView.automaticDimension,因此我认为这是因为新创建的单元格的估计高度不正确,因此我实现了tableView(_:estimatedHeightForRowAt:) -> CGFloat方法并为这些单元格提供了非常准确的高度值。但这并没有帮助解决跳跃问题。在尝试了所有可能的UITableView.RowAnimation适合我的需求之后,我决定完全禁用更新动画。这是我当前更新表格视图的方式:

self.items.append(contentsOf: loadedItems)
UIView.setAnimationsEnabled(false)
self.tableView.insertRows(at: additionalIndexPaths,with: .none)
UIView.setAnimationsEnabled(true)

这种方法摆脱了更新动画,同时又引入了另一个问题:感觉表视图在更新动画期间没有响应,就像我设置isUserInteractionEnabled = false一秒钟一样。那么用没有动画和跳转的新行更新表视图的最佳方法是什么?在此先感谢:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)