Cocoa键值编码和反向关系属性

时间:2010-07-19 03:11:25

标签: cocoa key-value-coding

我正在试图弄清楚KVC机制在处理彼此反向关系的关系属性时是否提供任何帮助。我将使用人为的标准部门/员工示例。

@interface Department : NSObject {
      NSMutableArray *employees;
}
@property (retain) NSMutableArray *employees;
// KVC methods for mutating the employees array

@end


@interface Employee : NSObject {
    Department *department;
}
@property (retain) Department *department;

只有这一点(以及省略的KVC收集方法)KVC为管理两个方向的关系提供了哪些帮助?我现在只处于概念阶段。我知道使用Core Data我可以设置显式的反向关系,因此当我使用[myDepartment insertObject:newEmployee inEmployeesAtIndex:lastIndex];时,newEmployee.department会自动设置为myDepartment,但是我可以通过单独的KVC和运行时来实现这一点,还是我需要核心数据?

提前感谢您的帮助。

编辑有些不相关但也很重要,在我的代码中,我将Employee的属性设置为Department retain,但我想知道这是否会导致保留周期?

1 个答案:

答案 0 :(得分:1)

Key-Value Coding中没有任何内容可以帮助您维持反向关系。您可以利用键值观察来执行此操作。

您要做的主要事情是:

  • 实现您自己的等效于NSManagedObject的类,而不是直接为您的实体类继承NSObject,因为毕竟您不能保证任意NSObject子类将与您提出的系统一起使用。 (或者,您可以在协议中编写所需的所有内容.EOF使用EOEnterpriseObject协议执行此操作。)
  • 实现与NSManagedObjectContext等效的自己的类来处理实体类实例的观察,这样它就可以告诉他们在适当的时候进行逆向维护。请注意,由KVO触发的反向维护不需要重新触发KVO,这会触发反向维护等等。
  • 实现与NSManagedObjectModel等效的自己的类层次结构,这样您的NSManagedObjectContext的等价物就知道实体类的实例的哪些属性可以具有反向关系,以及它们是什么。

鉴于所有这些,你可能只想使用核心数据,因为它已经完成了所有这些并且多年来已经进行了广泛的调整,以便做得很好。