Ios 什么';当核心数据中的实体更新(保存时)时,获得通知的最佳方式是什么?
我试图在一个ViewController中监视一个article对象。根据我的研究,有几种方法可以实现这一点,但我不确定哪种方法最合适: 1、让ViewController(或存储库或viewModel,如果我们谈论的是干净的体系结构)作为观察者,在核心数据保存时倾听通知 2、在我的核心数据抽象层中,为调用Ios 什么';当核心数据中的实体更新(保存时)时,获得通知的最佳方式是什么?,ios,core-data,Ios,Core Data,我试图在一个ViewController中监视一个article对象。根据我的研究,有几种方法可以实现这一点,但我不确定哪种方法最合适: 1、让ViewController(或存储库或viewModel,如果我们谈论的是干净的体系结构)作为观察者,在核心数据保存时倾听通知 2、在我的核心数据抽象层中,为调用save()时添加一个完成块回调 3、使用NSFetchedResultsController。我知道这是专为UITableView和UICollectionView设计的,但我看到人们使用它
save()
时添加一个完成块回调
3、使用NSFetchedResultsController。我知道这是专为UITableView和UICollectionView设计的,但我看到人们使用它只是为了进行监视
在这三条路径中,我倾向于第三条路径,但我不能100%确定这是否是最佳实践,因为大多数人在UITableView或UICollectionView上使用1对1。如果您想观察对象何时更改,1和2不一定会帮到您 您可以执行3-
NSFetchedResultsController
功能非常强大,但您也可以执行与NSFetchedResultsController
内部相同的操作,而且可能更简单:
您可以注册为NSManagedObjectContextObjectsIDChange的观察者
如果进行了更改,则在解决了这些更改的副作用后,在运行循环中每经过一次都会发布一次。因此,如果预期会有很多更改,那么使用它是安全的——您只会收到一次通知——并且双端关系将是一致的
它有一个丰富的
userInfo
字典。您的任务可以非常简单:检查对象的userInfo的NSUpdate对象键
和NSRefreshedObjectsKey
,如果有,请刷新视图。然后再检查NSDeletedObjectsKey
和NSInvalidatedObjectsKey
,如果您的对象在那里,请关闭视图控制器或将其返回到“空”状态。我没有很好的答案,但有一个关于核心数据最佳实践的非常好的WWDC 2018视频可能会在这里有所帮助。@matt我会看一看,谢谢!您建议的NSManagedObjectContextObjectsIDChange
方式与我的1选项基本相同吗?因此,我在1中的意思是VC注册为NSManagedObjectContextDidSave
的观察者。可能是我忘了谈论我不想关心任何未从上下文中保存的更改。所以,比较你的建议3和1,你还是喜欢1吗?(NSManagedObjectContextDidSave
)不太一样NSManagedObjectContextDidSave
告诉您某些上下文已保存<代码>NSManagedObjectContextObjectsIDChange告诉您正在观察的上下文中的对象已更改。如果保存了后台上下文,并且这些更改预期会合并到您的UI上下文中,则这可能发生在VC看到NSManagedObjectContextDidSave
之前或之后。(观察者不按任何特定顺序调用。)但是nsManagedObjectContextObjectsIDChange
将作为合并的结果发生,因此它保证在之后发生,当更改可见时。