在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有

Posted

技术标签:

【中文标题】在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有啥区别【英文标题】:In NSManagedObjectContextObjectsDidChangeNotification what is the difference between NSUpdatedObjectsKey and NSRefreshedObjectsKey在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有什么区别 【发布时间】:2017-02-03 02:38:40 【问题描述】:

文档说;

NSUpdatedObjectsKey 已更新对象集的键。

NSRefreshedObjectsKey 已刷新但未在此上下文范围内变脏的对象集的键。

这实际上是什么意思。我只是想知道发生了什么变化,所以我需要同时关注这两个键吗?

【问题讨论】:

见Purpose of NSRefreshedObjectsKey。 【参考方案1】:

NSUpdatedObjectsKey 表示对象的某个属性已更改。但是,如果您将属性设置为已经存在的相同值,那么即使没有真正改变,它也会显示为NSUpdatedObjectsKey。 (即issue.issueId = issue.issueId 将导致对象被“更改”)。

NSRefreshedObjectsKey 表示该对象已从存储中重新获取。如果您同时使用多个上下文,则该对象可能在您不查看时已更改。因此,在这些对象的上下文中调用refreshObject:mergeChanges: 将导致它们从存储中重新获取。这并不意味着他们有变化——但他们可能有。

关于使用它们,我不确定您为什么需要它们。从NSPersistentContainer 开始,我根本没有任何理由使用NSManagedObjectContextDidSaveNotification,因为NSPersistentContainer 为我管理所有上下文合并和更新。当我确实管理自己的核心数据堆栈时,我大多只是将整个通知传递给mergeChangesFromContextDidSaveNotification:。我从来没有打电话给refreshObject:mergeChanges:,因为我有其他方法可以确保上下文保持同步,所以我从来没有任何 RefreshedObjects。

我不确定是否回答了您的问题,希望对您有所帮助。

【讨论】:

NSPersistentContainer 是 ios10+,所以如果你像我一样需要支持 iOS9 那就不能用了。 是的,这是真的。如果您需要一个好的 pre-NSPersistentContainer 核心数据堆栈,我强烈建议您查看vimeo.com/89370886。视频中描述的设置在很多方面与 NSPersistentContainer 非常相似。在该设置中,也无需刷新对象,但如果要确保更新 fetchedResultsController,则必须确保在合并之前 NSUpdatedObjectsKeyNSDeletedObjectsKey 中的对象在上下文中出现故障。 好的,我会尝试更详细...我有两个上下文,一个是主要的,一个是私有的。当我保存私有上下文时,我将其更改合并到主上下文。我还将 obesrver 注册到主要上下文的更改。所以场景是这样的 - >在私有上下文中更改实体的属性,保存,然后我在主上下文中收到实体已刷新的通知。我自己从来没有调用 refreshObject:mergeChanges:

以上是关于在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据