Core-Data CoreDataGeneratedAccessors vs. 简单赋值
Posted
技术标签:
【中文标题】Core-Data CoreDataGeneratedAccessors vs. 简单赋值【英文标题】:Core-Data CoreDataGeneratedAccessors vs. simple assignment 【发布时间】:2010-09-13 07:13:43 【问题描述】:我在 Core Data 图中有一个一对多的关系,我试图了解使用 CoreDataGeneratedAccessors 方法和更改关系的简单分配之间的区别。例如,Core Data Programming Guide 具有部门和员工示例。在该示例中,他们使用 CoreDataGeneratedAccessors 来雇用和解雇员工:
[aDepartment addEmployeesObject:newEmployee];
[aDepartment removeEmployeesObject:firedEmployee];
他们没有定义反向关系,但说“部门”是与“员工”的反向关系。那么以下是否应该完成同样的事情?
newEmployee.department = aDepartment
firedEmployee.department = nil;
根据核心数据编程指南的Manipulating Relationships and Object Graph Integrity 部分,后面的示例应该自动修复所有关系以保持图形一致性。如果是这种情况,当存在反向关系时,是否有任何理由使用 CoreDataGeneratedAccessors?使用 CoreDataGeneratedAccessors 是否可以在反向关系上保持图形一致性?
【问题讨论】:
【参考方案1】:他们没有定义逆 关系,但说“部门”是 的反比关系 “雇员”。那么以下应该 完成同样的事情?
无论您修改关系的哪一端(逆向),这两个操作都具有相同的结果。
如果是这种情况,当存在反向关系时,是否有任何理由使用 CoreDataGeneratedAccessors?使用 CoreDataGeneratedAccessors 是否可以在反向关系上保持图形一致性?
一致性不是这两种方法的问题。 出于性能原因,使用适当的方法修改大型关系非常重要。
解决方案 1(解雇一个部门的所有员工)
for (Employee* employee in aDepartment.employees)
employee.department = nil
解决方案 2
aDepartment.employees = nil;
第一个解决方案将在每次操作后触发(表)视图的更新,而第二个解决方案将导致所有视图的更新。 如果您处理大量对象,这可能会有很大的不同。
如果您需要更深入的信息,我认为类似的主题已经在 SO 上讨论过。
【讨论】:
Martin- 感谢您的回复。我有一次可以使用 [aDepartment addEmployeesObject:newEmployee] 的情况,但应用程序中的后续调用(无论它是否在另一个 newEmployee 上)不会更新。但是,用 newEmployee.department=aDepartment 替换它总是有效的。这两个调用的行为似乎不一致,所以我很困惑他们应该做同样的事情。想法? @chris -- 听起来您在 Department 实体和 Employee 实体之间没有反向关系。 我只是在某些特殊情况下,在某些核心数据更改处理和观察者代码修改关系中触发观察时,才会出现这种行为。 (这是我的代码的一个错误) @TechZen:我很确定反向关系是正确的,因为我可以双向访问实体;一方面是部门,另一方面是员工 NSSet。奇怪的是,每次启动应用程序时,[aDepartment addEmployeesObject:newEmployee] 调用都会运行一次,但在后续调用中会失败。 @chris -- 不知道是什么原因造成的。您有员工的自定义访问器吗?如果您在不会触发 KVO 的任何地方使用原始访问器。你必须自己打电话给那些。以上是关于Core-Data CoreDataGeneratedAccessors vs. 简单赋值的主要内容,如果未能解决你的问题,请参考以下文章
在单个 NSTableView (Core-Data) 中显示来自多个实体的数据
从 Core-Data 请求不同的 NSManagedObject 属性实例时返回啥类?