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

时间:2012-02-15 17:45:30

标签: objective-c ios cocoa core-data nsmanagedobject

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

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

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

1 个答案:

答案 0 :(得分:7)

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

KVO会让关注Account属性更改的对象(您应该命名为account,而不是Account)注册,以便在更改属性时收到通知。 KVO将“正常工作”标准NSManagedObjects,而无需您做任何额外的工作。

相关方法如下:

    您在Config对象上调用
  • -addObserver:forKeyPath:options:context:来设置观察
  • -observeValueForKeyPath:ofObject:change:context:,只要观察到的值发生变化,就会在观察者对象上调用
  • -removeObserver:forKeyPath:您需要确保在观察者不再需要更改通知时(包括在取消分配观察者之前)进行调用。

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

以下编辑:

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

对NSManagedObjects的更改是立即的,在您在托管对象上下文上调用save:之前,它们不会保存到持久性存储中。也许如果你更详细地解释你想要完成什么以及为什么,我可以更好地帮助。