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

Bri*_*ian 3 cocoa core-data objective-c nsmanagedobject ios

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

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

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

And*_*sen 7

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

Account属性发生变化时,KVO会让关注属性更改的对象(您可能应该命名account,而不是名称Account)注册.KVO将"正常工作"标准的NSManagedObjects,而无需您做任何额外的工作.

相关方法如下:

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

这些都在链接文档中有更详细的描述.

编辑以下:

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

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