gpt4 book ai didi

objective-c - 核心数据 NSManagedObject - 跟踪属性是否已更改

转载 作者:可可西里 更新时间:2023-11-01 17:10:44 25 4
gpt4 key购买 nike

我有一个对象 - Config。我想知道 Config 上的 Account 属性是否已更改。发生这种情况时,我想发送一个 NSNotification,以便所有关心 Account 更改时间的代码都知道。我最初的想法是在我的 NSManagedObject 子类中,我将覆盖 setAccount 方法以将 transient 属性 AccountDidChange 设置为 true。然后在 didSave 中,如果 AccountDidChangetrue,我将发送通知,然后将其设置回 false。有没有更好的办法?但我的问题是,根据我的阅读,通过将 AccountDidChange 改回 false,我会弄脏我的对象并需要再次保存。

更多信息:Config 对象是应用程序的当前配置。 Account 实际上可以更改为 ActiveAccount。与具有所有帐户列表的 Account 实体存在关系。这个想法是用户可以更改应用程序的事件帐户。所以我们有一组服务器,用户一次只能登录一个。 Config.Account 指向该事件帐户,它用于设置与服务器的连接以检索信息。我正在使用 Config.Account 已更改的通知来告诉其他对象清理他们的信息 - 例如警报列表。基本上,所有信息都是每个帐户的,因此需要将其删除,然后在下一次使用新的事件帐户加载时重新获取。

另外,给定的名称不是我实际的对象名称 - 只是想让示例更容易理解。

最佳答案

看看 KVO(键值观察):Key-Value Observing Programming Guide .这是在 Cocoa 中执行此操作的标准方法,并且是成为一名优秀的 Cocoa 程序员需要了解的一项基础技术。

KVO 会让关心 Account 属性(你应该命名为 account,而不是 Account)的对象注册为属性更改时通知。 KVO 将“仅适用于”标准的 NSManagedObjects,无需您做任何额外的工作。

相关方法如下:

  • -addObserver:forKeyPath:options:context: 您在 Config 对象上调用它来设置观察
  • -observeValueForKeyPath:ofObject:change:context: 每当观测值发生变化时将在观察者对象上调用
  • -removeObserver:forKeyPath: 您需要确保在观察者不再需要更改通知时调用它(包括在观察者被释放之前)。

链接文档中对此进行了更详细的描述。

编辑如下:

在不了解您的应用程序的情况下,很难知道为什么您希望仅在保存时收到通知。 NSManagedObjectContext 发布 NSManagedObjectContextWillSaveNotification 和 NSManagedObjectContextDidSaveNotification。通知的 userInfo 有包含插入、更新和删除对象的数组,但通知不像单个属性那样细粒度。我想您可以手动跟踪 didSave 通知之间更改的帐户。如果您的商店中有很多配置,那可能会变得效率低下。

对 NSManagedObjects 的更改是即时的,它们不会保存到持久存储中,直到您在托管对象上下文上调用 save:。或许,如果您详细解释一下您要完成的目标以及原因,我可以提供更好的帮助。

关于objective-c - 核心数据 NSManagedObject - 跟踪属性是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298461/

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