performFetch 创建具有过多数据的可区分数据源快照

问题描述

在执行 NSBatchBatchInsertRequest调用 fetchedResultsController.performFetch() 后,frc 的委托方法 controller(_:didChangeContentWith:)调用,其中 NSDiffableDataSourceSnapshot<Section,NSManagedobjectID> 意外地包含 all 数据核心数据。

然而,我只是将数据插入到 Core Data 中。当我使用数千个单元格进行测试时,对每个 performFetch 处的所有数据应用快照会导致高内存负载和抖动滚动。

有没有办法让这个委托方法只接收数据源增量更新的快照?

代码

NSFetchedResultsController 的创建方法如下:

let fetchedResultsController = NSFetchedResultsController<MyManagedobject>(
        fetchRequest: fetchRequest,managedobjectContext: persistentContainer.viewContext,sectionNameKeyPath: nil,cacheName: nil
    )

NSFetchRequest

let fetchRequest = MyManagedobject.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "value",ascending: true)]
fetchRequest.fetchBatchSize = 10

快照应用在下面的此 NSFetchedResultsControllerDelegate 方法中。

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
    dataSource.apply(snapshot as NSDiffableDataSourceSnapshot<Section,NSManagedobjectID>,animatingDifferences: false)
}

对我来说最明显的解决方案是仅实现此委托方法,但该方法似乎并未被调用

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,didChangeContentWith diff: CollectionDifference<NSManagedobjectID>) {
    print(diff)
}

数据源到核心数据连接

  • 当要求数据源为特定的 NSManagedobjectID 创建单元格时,会使用 MyManagedobject 为该 NSManagedobjectID 找到正确的 fetchedResultsController.managedobjectContext.object(with:)
  • 然后将 MyManagedobject 转换为 Item,最终用于配置单元。

解决方法

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

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

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