我有一个对象 - 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:
之前,它们不会保存到持久存储区。也许如果你能更多地解释一下你想要完成什么以及为什么,我可以更好地提供帮助。