【问题标题】:Cocoa Key-Value Coding and inverse relationship propertiesCocoa Key-Value Coding 和反向关系属性
【发布时间】:2010-07-19 03:11:24
【问题描述】:

我试图弄清楚 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 和运行时来实现这一点,还是我需要 Core Data ?

提前感谢您的帮助。

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

【问题讨论】:

    标签: cocoa key-value-coding


    【解决方案1】:

    在键值编码中没有任何东西可以直接帮助您保持反向关系。但是,您可以利用 Key-Value Observing 来做到这一点。

    你要做的主要事情是:

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

    考虑到所有这些,您可能只想使用 Core Data,因为它已经完成了所有这些,并且经过多年的广泛调整,可以做得很好。

    【讨论】:

    • 啊哈,我开始意识到这是唯一的方法。你是对的,为此我使用 Core Data 会更好。但是,由于我的需求非常小(非常小的对象图),我想我可以通过“手工”来完成。感谢您的详尽回答!
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多