使用NSManagedObjectContextWillSaveNotification识别已更改对象的旧值和新值
我试图跟踪对核心数据上下文中对象的更改,跟踪与旧值和新值一起更改的属性的名称。
我已经注册NSManagedObjectContextWillSaveNotification
接收通知时,即将发生保存,并可以从上下文中拔出插入/更新/删除的对象…然后我可以看到使用.changedValues更改的值。
不过,我很难检索旧的价值
举个例子,我有一个跟踪某个位置的对象,所以其中一个变化就回来了:
po [obj changedValues] { originX = 260; originY = 180; }
这给了我在对象上已经改变的属性的新值。 要尝试获取旧的值,我然后使用changedValuesForCurrentEvent
,根据文档应该返回
“包含自上次发布
NSManagedObjectContextObjectsDidChangeNotification
以来已更改的持久性属性的键和旧值的字典”
但是,当我尝试这个,它回来空… …:
po [obj changedValuesForCurrentEvent] { }
我怎样才能捕捉到新旧价值?
你正在混合你的通知。 NSManagedObjectContextObjectsDidChangeNotification
会在您更改托pipe对象上的值时被调用,即使您尚未保存更改。 NSManagedObjectContextWillSaveNotification
会在保存时被调用。 所以顺序是:
- 你改变了一些属性 – >
NSManagedObjectContextObjectsDidChangeNotification
被张贴,你可以使用changedValuesForCurrentEvent
来查看改变了什么。 - 稍后,您保存更改。
NSManagedObjectContextWillSaveNotification
已过帐。 您可以调用changedValuesForCurrentEvent
,但是它没有帮助,因为它会在上一次更改通知后返回更改。 自上次变更通知以来没有变化。 如果有的话,你会收到另一个。 该方法被logging为可用于更改通知,而不是通知保存。
如果您希望获得旧值, 并且希望在发布将要保存通知时获取这些值,则可以使用以下选项:
- 监听
NSManagedObjectContextObjectsDidChangeNotification
。 caching有关某些集合对象(可能是NSDictionary
)更改的信息。 然后,当NSManagedObjectContextWillSaveNotification
发生时,查找这些更改,处理它们,并清除更改caching。 要么… - 当你得到
NSManagedObjectContextWillSaveNotification
,创build第二个本地托pipe对象上下文。 由于这是一个将保存通知,您仍然可以获取旧的值。 因此,获取每个保存的对象,比较前后值,看看有什么不同。
听起来像你应该只有当你收到你的“ NSManagedObjectContextWillSaveNotification
”通知, 才能调用“ changedValuesForCurrentEvent
” 。
如果“ changedValuesForCurrentEvent
”仍然返回一个空字典或对象,请检查通知是否在“ userInfo
”字典本身中有用。 也可能是没有发布NSManagedObjectContextObjectsDidChangeNotification
“,就像你从那里发布的文档一样。