核心数据NSManagedObject – 跟踪属性是否改变

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

更多信息: Config对象是应用程序的当前configuration。 Account实际上可以更改为ActiveAccount 。 与Account实体有关系,其中包含所有帐户的列表。 这个想法是,用户可以更改应用程序的活动帐户。 所以我们有一套服务器,用户一次只能login一个。 Config.Account指向该活动帐户,并用于build立到服务器的连接以检索信息。 我正在使用这个通知Config.Account已经改变,告诉其他对象清理他们的信息 – 如警报列表。 基本上,所有的信息都是每个账户,所以它需要被删除,然后在新的活动账户的下一次加载中重新获取。

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

看看KVO(键值观测): 键值观测编程指南 。 这是在Cocoa中这样做的标准方法,并且是您需要理解为一名优秀的Cocoa程序员的基本技术。

KVO会让关心更改Account属性的对象(您应该指定account而不是Account )注册,以便在属性发生变化时通知您。 KVO将为标准NSManagedObjects“正常工作”,而不需要任何额外的工作。

相关的方法如下:

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

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

编辑如下:

不知道你的应用程序的任何东西,很难知道为什么你只想保存通知。 NSManagedObjectContext发布NSManagedObjectContextWillSaveNotification和NSManagedObjectContextDidSaveNotification。 通知的userInfo具有包含插入,更新和删除对象的数组,但通知并不像单个属性那样精细。 我想你可以手动跟踪didSave通知之间的更改帐户。 如果您的商店中有大量configuration,那么效率可能会很低。

对NSManagedObjects的更改是即时的,直到您在托pipe对象上下文中调用save:它们才被保存到持久性存储中。 也许如果你更多地解释你想要完成什么,为什么,我可以更好地帮助。