在 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,则必须确保在合并之前NSUpdatedObjectsKey
和 NSDeletedObjectsKey
中的对象在上下文中出现故障。
好的,我会尝试更详细...我有两个上下文,一个是主要的,一个是私有的。当我保存私有上下文时,我将其更改合并到主上下文。我还将 obesrver 注册到主要上下文的更改。所以场景是这样的 - >在私有上下文中更改实体的属性,保存,然后我在主上下文中收到实体已刷新的通知。我自己从来没有调用 refreshObject:mergeChanges:以上是关于在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?