ios - 当关系发生变化时,有没有一种好方法来更新 NSManagedObject?

标签 ios objective-c core-data ios7

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

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

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

Person 实体有一个 vcard 属性,该属性以字符串形式保存该人的 vCard 数据。

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

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

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

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

最佳答案

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

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

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

关于ios - 当关系发生变化时,有没有一种好方法来更新 NSManagedObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641154/

相关文章:

objective-c - 事件对象被垃圾收集了吗?

objective-c - NSOutlineView 和 NSTreeController 示例

Objective-C:重构代码 - 如何获取指向 View 实例的指针?

core-data - 核心数据关系导致删除后保存错误

ios - 如何在 UITableView 中按字母顺序对字典数组进行排序和分类,作为 swift 3.0 中的部分

ios - GKSession 模式对等 : How to automatically connect two peers without any button/confirmation?

objective-c - 带有 persistentStoreCoordinator 的随机 EXC_BAD_ACCESS

ios - 如何在Core Data中保存键值对?

iphone - NSOperationQueue waitUntilAllOperationsAreFinished 与 performSelectorOnMainThread

ios - 以 UTF-8 格式转换响应时出现问题