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

我试图跟踪对核心数据上下文中对象的更改,跟踪与旧值和新值一起更改的属性的名称。

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

不过,我很难检索旧的价值

举个例子,我有一个跟踪某个位置的对象,所以其中一个变化就回来了:

 po [obj changedValues] { originX = 260; originY = 180; } 

这给了我在对象上已经改变的属性的新值。 要尝试获取旧的值,我然后使用changedValuesForCurrentEvent ,根据文档应该返回

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

但是,当我尝试这个,它回来空… …:

 po [obj changedValuesForCurrentEvent] { } 

我怎样才能捕捉到新旧价值?

你正在混合你的通知。 NSManagedObjectContextObjectsDidChangeNotification会在您更改托pipe对象上的值时被调用,即使您尚未保存更改。 NSManagedObjectContextWillSaveNotification会在保存时被调用。 所以顺序是:

  1. 你改变了一些属性 – > NSManagedObjectContextObjectsDidChangeNotification被张贴,你可以使用changedValuesForCurrentEvent来查看改变了什么。
  2. 稍后,您保存更改。 NSManagedObjectContextWillSaveNotification已过帐。 您可以调用changedValuesForCurrentEvent ,但是它没有帮助,因为它会在上一次更改通知后返回更改。 自上次变更通知以来没有变化。 如果有的话,你会收到另一个。 该方法被logging为可用于更改通知,而不是通知保存。

如果您希望获得旧值, 并且希望在发布将要保存通知时获取这些值,则可以使用以下选项:

  • 监听NSManagedObjectContextObjectsDidChangeNotification 。 caching有关某些集合对象(可能是NSDictionary )更改的信息。 然后,当NSManagedObjectContextWillSaveNotification发生时,查找这些更改,处理它们,并清除更改caching。 要么…
  • 当你得到NSManagedObjectContextWillSaveNotification ,创build第二个本地托pipe对象上下文。 由于这是一个保存通知,您仍然可以获取旧的值。 因此,获取每个保存的对象,比较前后值,看看有什么不同。

听起来像你应该只有当你收到你的“ NSManagedObjectContextWillSaveNotification ”通知, 才能调用“ changedValuesForCurrentEvent ” 。

如果“ changedValuesForCurrentEvent ”仍然返回一个空字典或对象,请检查通知是否在“ userInfo ”字典本身中有用。 也可能是没有发布NSManagedObjectContextObjectsDidChangeNotification “,就像你从那里发布的文档一样。