标签: uitableviewdiffabledatasource

超过 20K 行的不同数据源性能问题

当我拥有较大的数据集(大约 22,000 个项目)时,我会遇到可比较数据源的性能问题。令我惊讶的是,当动画打开时,应用快照需要花费如此多的时间。请参阅代码部分:

let shouldAnimate = tableView.numberOfSections != 0
apply(snapshot as NSDiffableDataSourceSnapshot<String, NSManagedObjectID>, animatingDifferences: shouldAnimate)
Run Code Online (Sandbox Code Playgroud)

注意: Jesse Squires 提供一个很好的资源:

我的问题是,考虑到应用快照是 O(n) 操作,我是否遗漏了某些内容或可区分数据源无法更快地处理此问题?

关闭动画,与 相同reloadData,会有一定帮助。

示例代码是由很棒的SwiftLee基于这篇文章设置的。

在此输入图像描述

请参阅此处的示例项目。

示例视频在这里

更新(2021 年 9 月 2 日):这里有一个很好的 Twitter 讨论。

旁注:示例应用程序可以通过不设置来改进,fetchBatchSize因为请求与NSFetchedResultsController. 请参阅链接

core-data uitableview nsfetchedresultscontroller diffabledatasource uitableviewdiffabledatasource

5
推荐指数
1
解决办法
1011
查看次数

应用 UITableViewDiffableDataSource 快照后 TableView 滚动到顶部

我正在使用 UITableViewDataSourcePrefetching 进行分页。

这些值将从领域本地存储中获取。

我将得到一个对象数组。这些值将应用于现有的 UITableViewDiffableDataSource 数据源。

应用快照后,表格视图滚动到顶部。

我已经验证我的所有 ChatMessage 对象都具有唯一的 hashValues。

如何防止滚动?

视频链接TableView_scroll_issue_video

鉴于我的代码片段

private func appendLocal(chats chatMessages: [ChatMessage]) {
    var sections: [String] = chatMessages.map({ $0.chatDateTime.toString() })
    sections.removeDuplicates()
    guard !sections.isEmpty else { return }
    var snapshot = dataSource.snapshot()
    let chatSections = snapshot.sectionIdentifiers
    sections.forEach { section in
        let messages = chatMessages.filter({ $0.chatDateTime.toString() == section })
        /// Checking the section is already exists in the dataSource
        if let index = chatSections.firstIndex(of: section) {
            let indexPath = IndexPath(row: 0, section: index) …
Run Code Online (Sandbox Code Playgroud)

uitableview ios swift diffabledatasource uitableviewdiffabledatasource

5
推荐指数
1
解决办法
1325
查看次数