我有一个对象 - Config
。我想知道Account
上的Config
属性是否已更改。发生这种情况时,我想发送一个NSNotification
,以便关注Account
更改何时知道的所有代码。我最初的想法是在我的NSManagedObject
子类中,我将覆盖setAccount
方法,将瞬态属性AccountDidChange
设置为true
。然后在didSave
AccountDidChange
如果true
false
,我会发送通知,然后将其设置回AccountDidChange
。有没有更好的办法?我的问题是,根据我的阅读,通过将false
更改回Config
,我会弄脏我的对象并需要再次保存。
更多信息:
Account
对象是应用程序的当前配置。 ActiveAccount
实际上可以更改为Account
。与Config.Account
实体存在关系,该关系具有所有帐户的列表。想法是用户可以更改应用程序的活动帐户。所以我们有一组服务器,用户一次只能登录一个。 Config.Account
指向该活动帐户,它用于设置与服务器的连接以检索信息。我正在使用{{1}}已更改的通知,告诉其他对象清理其信息 - 如警报列表。基本上,所有信息都是按照帐户进行的,因此需要将其删除,然后使用新的活动帐户在下次加载时重新获取。
此外,给定的名称不是我的实际对象名称 - 只是试图让示例更容易理解。
答案 0 :(得分:7)
看看KVO(键值观察):Key-Value Observing Programming Guide。这是在Cocoa中执行此操作的标准方法,并且是您需要了解成为优秀Cocoa程序员的基础技术。
KVO会让关注Account
属性更改的对象(您应该命名为account
,而不是Account
)注册,以便在更改属性时收到通知。 KVO将“正常工作”标准NSManagedObjects,而无需您做任何额外的工作。
相关方法如下:
-addObserver:forKeyPath:options:context:
来设置观察-observeValueForKeyPath:ofObject:change:context:
,只要观察到的值发生变化,就会在观察者对象上调用-removeObserver:forKeyPath:
您需要确保在观察者不再需要更改通知时(包括在取消分配观察者之前)进行调用。链接文档中对此进行了更详细的描述。
以下编辑:
在不了解您的应用程序的情况下,很难知道为什么您只有在保存时才会收到通知。 NSManagedObjectContext发布NSManagedObjectContextWillSaveNotification和NSManagedObjectContextDidSaveNotification。通知的userInfo包含包含插入,更新和删除对象的数组,但通知不像单个属性那样细粒度。我想您可以手动跟踪didSave通知之间已更改的帐户。如果你的商店里有很多配置,这可能会效率低下。
对NSManagedObjects的更改是立即的,在您在托管对象上下文上调用save:
之前,它们不会保存到持久性存储中。也许如果你更详细地解释你想要完成什么以及为什么,我可以更好地帮助。