1

在执行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正确的。MyManagedObjectNSManagedObjectIDfetchedResultsController.managedObjectContext.object(with:)
  • 然后将MyManagedObject转换为Item,最终用于配置单元格。
4

0 回答 0