当关系发生变化时,是不是有更新 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 的数据源发生变化时,如何更新它?