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

Posted

技术标签:

【中文标题】当关系发生变化时,是不是有更新 NSManagedObject 的好方法?【英文标题】:Is there a good way to update an NSManagedObject when relationships change?当关系发生变化时,是否有更新 NSManagedObject 的好方法? 【发布时间】:2014-02-08 02:29:25 【问题描述】:

这是我的场景的简化版本,但没关系。

假设您有三个 CoreData 实体,每个实体都有一个对应的 NSManagedObject 子类,并且一对一的关系如下:

人员 -> 联系人记录 -> 电话号码

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

PhoneNumber 实体有两个属性:实际号码和电话号码的类型(手机、家庭、工作等)。

现在,在 Person willSave 方法中,我正在更新 vcard 属性。如果 Person 对象上的另一个属性发生了变化,这可以正常工作。但是,如果我更改 PhoneNumber 对象上的类型或号码,或 ContactRecord 上的任何属性,则不会在 Person 对象上调用 willSave 方法。

当 PhoneNumber 对象的属性发生变化时,是否有一种好方法可以更新 Person 对象?

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

【问题讨论】:

【参考方案1】:

NSManagedObjectContextWillSaveNotification 方法在保存之前被调用,所以你可以在那里进行更改,它不需要第二次保存。

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

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

【讨论】:

您认为通知比-willSave: 有哪些优势? 我一定是看错了通知名称:我认为它是 DidSave,而不是 WillSave。这可能会奏效。 Marcus:在“children”中使用willSave 的缺点是PhoneNumber 类需要了解有关Person 类的信息。在这个例子中这是微不足道的,但在应用程序更复杂的现实中,我想尽可能地保持它们的松散耦合。【参考方案2】:

直截了当的方法是在子级中继续使用-willSave: 方法。当-willSave:ContactRecord 上触发时,ping 父级并要求它重新计算 vcard。你可以对PhoneNumber 做同样的事情。只需恢复关系即可。

这是假设您的关系是双向的,虽然标记为警告,但实际上是 Core Data 的要求。

【讨论】:

以上是关于当关系发生变化时,是不是有更新 NSManagedObject 的好方法?的主要内容,如果未能解决你的问题,请参考以下文章

仅当烧瓶中的变量发生变化时才更新网站

当 Symfony 教义对象的一个​​属性发生变化时更新另一个属性

当 NSTableView 的数据源发生变化时,如何更新它?

当设备方向发生变化时,UIViewController 不会更新视图的约束

当 coreData 值发生变化时,如何更新我的其他视图?

当ObservableCollection发生变化时更新CollectionViewSource WP7