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

可可键值编码及其逆关系性质

  •  1
  • jbrennan  · 技术社区  · 14 年前

    我试图弄清楚,在处理相互反向关系的关系属性时,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为管理双向关系提供了什么样的帮助?我现在只处于概念阶段。我知道通过核心数据,我可以设置显式的逆关系,因此当我使用 [myDepartment insertObject:newEmployee inEmployeesAtIndex:lastIndex]; 然后 newEmployee.department 自动设置为 myDepartment 但是,我是否可以只使用kvc和运行时来实现这一点,或者我是否需要核心数据?

    事先谢谢你的帮助。

    编辑 有点不相关,但也很重要,在我的代码中,我把员工的财产作为 retain 但我想知道这是否会导致保留周期?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Chris Hanson    14 年前

    在键值编码中没有直接帮助您保持反向关系的内容。你可以利用关键价值 观察 但是要这样做。

    你要做的主要事情是:

    • 实现与nsmanagedObject等效的自己的类,而不仅仅是为实体类直接子类化nsObject,因为毕竟不能保证任意nsObject子类可以与您想到的系统一起工作。(或者,你可以把他们需要的东西编进一个协议中。eof使用eoenterpriseObject协议执行此操作。)
    • 实现与nsmanagedObjectContext等效的自己的类来处理对实体类实例的观察,这样它就可以告诉它们在适当的时候进行反向维护。请注意,由kvo触发的反向维护不需要重新触发kvo,这将触发反向维护等。
    • 实现与nsManagedObjectModel等效的自己的类层次结构,这样,与nsManagedObjectContext等效的类就知道实体类实例的哪些属性可以具有反向关系,以及这些属性是什么。

    考虑到所有这些,您可能只想使用核心数据,因为它已经完成了所有这些工作,而且多年来已经进行了广泛的调整,以使其能够很好地完成。