我对我之前(已删除)的答案表示歉意。快照与核心数据上下文无关。
的目的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()
在表视图上。