Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';当核心数据中的实体更新(保存时)时,获得通知的最佳方式是什么?_Ios_Core Data - Fatal编程技术网

Ios 什么';当核心数据中的实体更新(保存时)时,获得通知的最佳方式是什么?

Ios 什么';当核心数据中的实体更新(保存时)时,获得通知的最佳方式是什么?,ios,core-data,Ios,Core Data,我试图在一个ViewController中监视一个article对象。根据我的研究,有几种方法可以实现这一点,但我不确定哪种方法最合适: 1、让ViewController(或存储库或viewModel,如果我们谈论的是干净的体系结构)作为观察者,在核心数据保存时倾听通知 2、在我的核心数据抽象层中,为调用save()时添加一个完成块回调 3、使用NSFetchedResultsController。我知道这是专为UITableView和UICollectionView设计的,但我看到人们使用它

我试图在一个ViewController中监视一个article对象。根据我的研究,有几种方法可以实现这一点,但我不确定哪种方法最合适:

1、让ViewController(或存储库或viewModel,如果我们谈论的是干净的体系结构)作为观察者,在核心数据保存时倾听通知

2、在我的核心数据抽象层中,为调用
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
将作为合并的结果发生,因此它保证在之后发生,当更改可见时。