在执行NSBatchBatchInsertRequest
和调用之后fetchedResultsController.performFetch()
,frc 的委托方法controller(_:didChangeContentWith:)
被调用,NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>
其中意外包含了 Core Data 中的所有数据。
但是,我只是将新数据插入到 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
,最终用于配置单元格。