是否可以从 NSFetchedResultsController 获取最新快照

2024-05-07

从 iOS 13 开始,保持UITableView与一个同步NSFetchedResultsController好像是有快照的。

每当 ManagedObjectContext 报告添加、删除或更新时,NSFetchedResultsController 都会向其委托提供快照引用。使用快照时(NSDiffableDataSourceSnapshot),只有一个 FRC 委托方法需要实现:controller(_:didChangeContentWith:)。为了使该委托方法起作用,必须键入 UITableViewDiffableDataSource 和 Snapshot<String, NSManagedObjectID>.

有用mostly https://stackoverflow.com/questions/58475481/how-to-get-a-diffable-snapshot-from-an-nsfetchresultscontroller-in-ios-13.

但如果整个表都需要更新怎么办?使用tableView.reloadData() or frc.performFetch()似乎是反模式。

edit

我手动构建了一个快照,并在必要时调用 apply。但由于我的快照基于 NSFetchedResultsSectionInfo 对象,因此我似乎在复制 FRC 已有的内容:Hashable 部分标题和 Hashable NSManagedObjectIDs


我对我之前(已删除)的答案表示歉意。快照与核心数据上下文无关。

的目的NSFetchedResultsController和这个结合Core Data是更新UI时NSManagedObjectContext已保存。

为了能够控制可比较数据源的动画(以解决荒谬的行为),您必须子类化UITableViewDiffableDataSource并添加一个属性animatingDifferences。进一步采用NSFetchedResultsControllerDelegate在子类中(not在视图控制器中)。

class DiffableCoreDataSource: UITableViewDiffableDataSource<String,NSManagedObjectID> {
    var animatingDifferences = false
}

extension DiffableCoreDataSource : NSFetchedResultsControllerDelegate
{
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
        apply(snapshot as NSDiffableDataSourceSnapshot<String, NSManagedObjectID>, animatingDifferences: animatingDifferences)
        animatingDifferences = true // set it to the default
    }
}

在视图控制器中设置delegate假设有一个 FRC 到子类dataSource财产代表DiffableCoreDataSource

frc.delegate = dataSource

如果记录被更新设置dataSource.animatingDifferences to false就在保存上下文之前。

重新加载整个表视图调用frc.performFetch()。从不打电话reloadData()在表视图上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以从 NSFetchedResultsController 获取最新快照 的相关文章

随机推荐