核心数据 NSManagedObject - 跟踪属性是否发生更改



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

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

此外,给定的名称不是我的实际对象名称 - 只是试图使示例更容易理解。

看看 KVO(键值观察(:键值观察编程指南。这是在Cocoa中执行此操作的标准方法,并且是成为一名优秀Cocoa程序员需要了解的基本技术。

KVO 将允许关心Account属性更改的对象(您可能应该将其命名为 account,而不是Account(注册,以便在属性更改时收到通知。KVO 将"只适用于"标准 NSManagedObjects,而无需您进行任何额外的工作。

相关方法如下:

  • -addObserver:forKeyPath:options:context:调用 Config 对象以设置观察
  • 每当观察值发生变化时,将在观察对象上调用-observeValueForKeyPath:ofObject:change:context:
  • 您需要确保在观察者不再需要更改通知时(包括在解除分配观察器之前(调用-removeObserver:forKeyPath:

这在链接的文档中有更详细的描述。

编辑如下:

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

对 NSManagedObjects 的更改是即时的,只是在托管对象上下文上调用 save: 之前,它们不会保存到持久存储区。也许如果你能更多地解释一下你想要完成什么以及为什么,我可以更好地提供帮助。

最新更新