使用NSManagedObjectContextWillSaveNotification标识已更改对象的旧值和新值

Joh*_*tin 4 core-data objective-c ios

我正在尝试跟踪核心数据上下文中对象的更改,跟踪已更改的属性的名称以及旧值和新值.

我已经注册了NSManagedObjectContextWillSaveNotification在即将发生保存时收到通知,并且可以从上下文中提取插入/更新/删除的对象...然后我可以使用.changedValues查看更改的值.

但是,我在检索旧值时遇到困难......

作为一个例子,我有一个跟踪位置的对象,因此其中一个更改返回:

po [obj changedValues]
{
    originX = 260;
    originY = 180;
}
Run Code Online (Sandbox Code Playgroud)

这为我提供了对象上已更改的属性的新值.为了尝试获取旧值,我正在使用changedValuesForCurrentEvent,根据文档应该返回

"包含自上次发布以来已更改的持久属性的键和旧值的字典 NSManagedObjectContextObjectsDidChangeNotification"

但是,当我尝试这个时,它又回来了......:

po [obj changedValuesForCurrentEvent]
{
}
Run Code Online (Sandbox Code Playgroud)

如何捕获旧值和新值?

Tom*_*ton 9

你正在混淆你的通知.NSManagedObjectContextObjectsDidChangeNotification在您更改托管对象的值时,即使您尚未保存更改,也会调用它.NSManagedObjectContextWillSaveNotification保存时稍后会调用.所以顺序是:

  1. 您更改了一些属性 - > NSManagedObjectContextObjectsDidChangeNotification已发布,您可以使用changedValuesForCurrentEvent以查看更改的内容.
  2. 稍后,您保存更改.NSManagedObjectContextWillSaveNotification已发布.你可以打电话changedValuesForCurrentEvent,但它没有帮助,因为它返回自上次更改通知以来的更改.自上次更改通知后没有任何更改.如果有,你会收到另一个.记录该方法对更改通知有用,而不是对保存通知有用.

如果您想要旧的值,并且希望在发布保存通知时获取它们,则有几个选项:

  • 听着NSManagedObjectContextObjectsDidChangeNotification.缓存有关某些集合对象(可能NSDictionary)中的更改的信息.然后,当NSManagedObjectContextWillSaveNotification发生这种情况时,查找这些更改,处理它们并清除更改缓存.要么...
  • 获得后NSManagedObjectContextWillSaveNotification,创建第二个本地托管对象上下文.由于这是一个意志保存通知,您仍然可以获取旧值.因此,获取已保存的每个对象并比较之前和之后的值以查看不同的内容.