这是我的方案的简化版本,但没关系。
假设您有三个CoreData实体,每个实体都有一个NSManagedObject的相应子类,以及如下所示的一对一关系:
人 - > ContactRecord - > ******中国
Person实体有一个vcard属性,用于保存字符串中该人的vCard数据。
PhoneNumber实体有两个属性:实际号码和电话号码类型(小区,家庭,工作等)。
现在,在Person willSave
方法中,我正在更新vcard属性。如果Person对象上的另一个属性已更改,则此方法正常。但是,如果我更改PhoneNumber对象上的类型或数字,或者ContactRecord上的任何属性,则不会在Person对象上调用willSave
方法。
当一个属性在PhoneNumber对象上转换时,是否有一种更新Person对象的好方法?
现在,我看到的最佳选择是使用NSManagedObjectContextWillSaveNotification。该通知调用的方法可以筛选更改的对象并恢复反向关系以调用Person对象上的某个方法,但这是在NSManagedObjectContext已经保存之后发生的,因此在此之后需要另外保存。我希望在保存发生之前将此属性设置为正确的值。
答案 0 :(得分:1)
直接的方法是继续在孩子中使用-willSave:
方法。当-willSave:
触发ContactRecord
然后ping父母并要求它重新计算vcard。你可以为PhoneNumber
做同样的事情。只需恢复关系。
这假设你的关系是双向的,虽然被标记为警告,但确实是核心数据的要求。
答案 1 :(得分:1)
NSManagedObjectContextWillSaveNotification方法在保存发生之前调用,因此您可以在那里进行更改,它不需要第二次保存。
我在这种情况下的偏好是根本不存储vcard,而是将它作为readonly的依赖属性。我假设您不需要经常访问vcard,因此在getter方法中即时生成数据应该可以正常工作,并且数据将始终是最新的。
在保存之前更新数据的一个问题是您必须确保保存。如果您试图在不保存的情况下获取vcard,它将会过时。依赖只读属性不会出现此问题。