gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:29:09 24 4
gpt4 key购买 nike

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

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

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

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

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

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

"a dictionary containing the keys and old values of persistent properties that have changed since the last posting of NSManagedObjectContextObjectsDidChangeNotification"

但是,当我尝试这样做时,它返回时是空的...:

po [obj changedValuesForCurrentEvent]
{
}

我如何捕获旧值和新值?

最佳答案

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

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

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

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

关于ios - 使用 NSManagedObjectContextWillSaveNotification 识别已更改对象的旧值和新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23433838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com