代码之家  ›  专栏  ›  技术社区  ›  chris

核心数据CoreDataGeneratedAccessors与简单分配

  •  5
  • chris  · 技术社区  · 16 年前

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

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

    他们没有定义反向关系,但说“部门”是与“员工”的反向关系。那么下面的事情应该完成同样的事情吗?

    newEmployee.department = aDepartment
    firedEmployee.department = nil;
    

    根据 Manipulating Relationships and Object Graph Integrity 在核心数据编程指南的一节中,后面的示例应该自动修复所有关系以保持图形的一致性。如果是这样的话,当存在逆关系时,是否有理由使用CordaAdGeAdvAccess?使用coredatageneratedaccessors是否能保持反向关系上的图形一致性?

    1 回复  |  直到 13 年前
        1
  •  2
  •   Martin Brugger    16 年前

    他们没有定义反义词 关系,但是说“部门”是 与之相反的关系 “雇员”。那么下面应该 完成同样的事情?

    无论修改关系的哪一端(带反转),这两个操作都具有相同的结果。

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

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

    解决方案1(解雇部门所有员工)

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

    解决方案2

    aDepartment.employees = nil;
    

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

    如果你需要更深入的信息,我想类似的话题已经讨论过了。