当关系发生变化时,是否有更好的方法来更新NSManagedObject?

时间:2014-02-08 02:29:26

标签: ios objective-c core-data ios7

这是我的方案的简化版本,但没关系。

假设您有三个CoreData实体,每个实体都有一个NSManagedObject的相应子类,以及如下所示的一对一关系:

人 - > ContactRecord - > ******中国

Person实体有一个vcard属性,用于保存字符串中该人的vCard数据。

PhoneNumber实体有两个属性:实际号码和电话号码类型(小区,家庭,工作等)。

现在,在Person willSave方法中,我正在更新vcard属性。如果Person对象上的另一个属性已更改,则此方法正常。但是,如果我更改PhoneNumber对象上的类型或数字,或者ContactRecord上的任何属性,则不会在Person对象上调用willSave方法。

当一个属性在PhoneNumber对象上转换时,是否有一种更新Person对象的好方法?

现在,我看到的最佳选择是使用NSManagedObjectContextWillSaveNotification。该通知调用的方法可以筛选更改的对象并恢复反向关系以调用Person对象上的某个方法,但这是在NSManagedObjectContext已经保存之后发生的,因此在此之后需要另外保存。我希望在保存发生之前将此属性设置为正确的值。

2 个答案:

答案 0 :(得分:1)

直接的方法是继续在孩子中使用-willSave:方法。当-willSave:触发ContactRecord然后ping父母并要求它重新计算vcard。你可以为PhoneNumber做同样的事情。只需恢复关系。

这假设你的关系是双向的,虽然被标记为警告,但确实是核心数据的要求。

答案 1 :(得分:1)

NSManagedObjectContextWillSaveNotification方法在保存发生之前调用,因此您可以在那里进行更改,它不需要第二次保存。

我在这种情况下的偏好是根本不存储vcard,而是将它作为readonly的依赖属性。我假设您不需要经常访问vcard,因此在getter方法中即时生成数据应该可以正常工作,并且数据将始终是最新的。

在保存之前更新数据的一个问题是您必须确保保存。如果您试图在不保存的情况下获取vcard,它将会过时。依赖只读属性不会出现此问题。