2010-09-13 111 views
5

我在Core Data图中有一对多的关系,我试图理解使用CoreDataGeneratedAccessors方法和简单赋值来改变关系的区别。例如,Core Data Programming Guide有一个部门和员工示例。在那个例子中,他们使用CoreDataGeneratedAccessors聘用和解雇员工:核心数据CoreDataGeneratedAccessors与简单赋值

[aDepartment addEmployeesObject:newEmployee]; 
[aDepartment removeEmployeesObject:firedEmployee]; 

他们没有定义的反比关系,但说“部门”是反比关系,以“雇员”。下面的话是否应该完成同样的事情?

newEmployee.department = aDepartment 
firedEmployee.department = nil; 

根据核心数据编程指南的Manipulating Relationships and Object Graph Integrity章节,后面的例子应该自动修复的所有关系,以保持一致性图。如果是这种情况,当存在反向关系时,是否有任何理由使用CoreDataGeneratedAccessors?使用CoreDataGeneratedAccessors是否在反向关系上保持图形一致性?

回答

2

他们没有定义逆 关系,但说“部门”是 到 “雇员”的反比关系。下面的 应该完成同样的事情吗?

无论您修改关系的哪一端(与反向),两个操作都有相同的结果。

如果是这样的话,是否有任何理由在存在逆关系时使用CoreDataGeneratedAccessors?使用CoreDataGeneratedAccessors是否在反向关系上保持图形一致性?

两种方法的一致性不是问题。 由于性能方面的原因,使用适当的方法修改大型关系非常重要。

溶液1(烧成一个部门的所有雇员)

for (Employee* employee in aDepartment.employees) 
{ 
    employee.department = nil 
} 

溶液2

aDepartment.employees = nil; 

第一溶液将会触发(表 - )的更新视图,而第二每次操作后只会导致所有视图的更新。 如果您处理大量对象,这可能是一个很大的区别。

如果您需要更深入的信息,我认为类似的话题已经在SO上进行了讨论。

+0

Martin-感谢您的回复。我有一种情况,我可以使用[aDepartment addEmployeesObject:newEmployee]一次,但是应用程序内的后续调用(不管它是否在另一个新的员工上)不会更新。但是,用newEmployee.department = aDepartment替换它始终有效。这两个电话的行为似乎不一致,所以我感到困惑,他们应该做同样的事情。想法? – chris 2010-09-13 17:10:42

+0

@chris - 这听起来好像你在Department实体和Employee实体之间没有反向关系。 – TechZen 2010-09-14 12:28:06

+0

在某些特殊情况下,当某些核心数据更改处理和观察代码修改关系被触发时,我只会遇到这种行为。(这是我的代码的错误) – 2010-09-15 05:32:11