2017-02-03 95 views
3

该文档说,在NSManagedObjectContextObjectsDidChangeNotification NSUpdatedObjectsKey和NSRefreshedObjectsKey之间的区别是什么

NSUpdatedObjectsKey 已更新的对象集的关键字。

NSRefreshedObjectsKey 关键字,用于刷新但未在本上下文范围内变脏的对象集。

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

+0

请参见[NSRefreshedObjectsKey的用途](http://stackoverflow.com/q/12744328/4244136)。 – Willeke

回答

2

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

NSRefreshedObjectsKey表示该对象已从商店中重新获取。如果您同时使用多个上下文,那么当您不在寻找时该对象可能已经改变。因此,在这些对象的上下文中调用refreshObject:mergeChanges:将导致它们从商店中重新获取。这并不意味着他们有变化 - 但他们可能有变化。

关于使用它们,我不知道为什么你会需要。由于NSPersistentContainer,我完全没有理由使用NSManagedObjectContextDidSaveNotification,因为NSPersistentContainer为我管理所有上下文合并和更新。当我管理自己的核心数据堆栈时,我大多只是将整个通知传递给mergeChangesFromContextDidSaveNotification:。我从来没有打电话给refreshObject:mergeChanges:,因为我有其他方式确保上下文保持同步,所以我从来没有任何刷新对象。

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

+0

NSPersistentContainer是iOS10 +,所以如果你需要像我一样支持iOS9,那么你不能使用它。 – trapper

+0

是的,的确如此。如果您需要一个良好的NSPersistentContainer核心数据堆栈,我强烈建议您查看https://vimeo.com/89370886。视频中描述的设置在许多方面与NSPersistentContainer非常相似。在该设置中,不需要刷新对象,但如果要确保更新fetchedResultsController,则必须确保在合并之前上下文中的“NSUpdatedObjectsKey”和“NSDeletedObjectsKey”中的对象出现故障。 –

+0

好吧,我会尽量做得更精细......我有两个主要的,一个私人的背景。当我保存私人上下文时,我将其更改合并到主要上下文中。我还注册obesrver以改变主要背景。所以情况就像这样 - >在私有上下文中更改实体的属性,保存,然后我在主要上下文中获取该实体已刷新的通知。我从来没有自己调用refreshObject:mergeChanges: – MegaManX

相关问题