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)
如何捕获旧值和新值?
你正在混淆你的通知.NSManagedObjectContextObjectsDidChangeNotification在您更改托管对象的值时,即使您尚未保存更改,也会调用它.NSManagedObjectContextWillSaveNotification保存时稍后会调用.所以顺序是:
NSManagedObjectContextObjectsDidChangeNotification已发布,您可以使用changedValuesForCurrentEvent以查看更改的内容.NSManagedObjectContextWillSaveNotification已发布.你可以打电话changedValuesForCurrentEvent,但它没有帮助,因为它返回自上次更改通知以来的更改.自上次更改通知后没有任何更改.如果有,你会收到另一个.记录该方法对更改通知有用,而不是对保存通知有用.如果您想要旧的值,并且希望在发布保存通知时获取它们,则有几个选项:
NSManagedObjectContextObjectsDidChangeNotification.缓存有关某些集合对象(可能NSDictionary)中的更改的信息.然后,当NSManagedObjectContextWillSaveNotification发生这种情况时,查找这些更改,处理它们并清除更改缓存.要么...NSManagedObjectContextWillSaveNotification,创建第二个本地托管对象上下文.由于这是一个意志保存通知,您仍然可以获取旧值.因此,获取已保存的每个对象并比较之前和之后的值以查看不同的内容.