管理没有CoreData的反向关系

时间:2009-10-05 18:17:09

标签: cocoa oop cappuccino objective-j

这是Objective-J / Cappuccino的问题,但我添加了cocoa标签,因为框架非常相似。

Cappuccino的一个缺点是CoreData还没有被移植过,所以你必须手动制作所有的模型对象。

在CoreData中,您的反向关系会自动为您管理...如果您将对象添加到另一个对象中的多对多关系,您可以在两个方向上遍历图形。

没有CoreData,是否有任何干净的方法可以自动设置这些反向关系?

更具体的例子,我们来看一下典型的Department和Employees示例。要使用rails术语,Department对象有许多Employees,Employee属于Department。

因此我们的Department模型有一个NSMutableSet(或CPMutableSet)“employees”,其中包含一组Employees,而我们的Employee模型有一个变量“department”,指向拥有它的Department模型。

是否有一种简单的方法可以使得当我将新的Employee模型添加到集合中时,反向关系(employee.department)会自动设置?或者相反:如果我设置了员工的部门模型,那么它会自动添加到该部门的员工集中吗?

知道我正在创建一个对象,“ValidatedModel”,我的所有模型都是子类,它使用KVO添加了一些设置反向关系的方法。但我担心我做了很多毫无意义的工作,并且已经有了一种更简单的方法。

有人可以让我的担忧得到休息吗?

4 个答案:

答案 0 :(得分:2)

我不能专门谈论Objective-J,但是在没有Core Data的情况下这样做的通常方法是在setter中设置反向关系。因此,使用员工/部门示例,您可以执行以下操作:

- (void)setDepartment:(Department *)aDepartment {
    if (department == aDepartment)
        return;

    [department release];
    department = [aDepartment retain];

    [department addEmployee:self];
}

如果新值已与现有值匹配,则需要确保不更新实例变量。如果您没有,setDepartment:会致电addEmployee:addEmployee:会在无限循环中致电setDepartment:

另请注意,这是保留周期的公开邀请。这取决于你的模型的结构,但是“拥有”另一个的对象应该retain。所以我的例子可能不是最好的,因为说部门“拥有”员工可能更准确。

答案 1 :(得分:2)

您可能想在setter中设置关系。使用您的示例,Objective-J代码看起来与此类似。

- (void)setDepartment:(Department)aDepartment {
    if (department === aDepartment)
        return;

    [department addEmployee:self];
}

如您所见,不需要保留/释放。 Objective-J建立在垃圾收集的javascript之上。所有内存管理方法都已实现,但什么都不做(除了使代码混乱)

另外因为这是javascript,通常建议检查类型相等(===)有关类型相等的更多信息,请参阅:http://www.webreference.com/js/column26/stricteq.html

答案 2 :(得分:2)

查看这位280名北方员工的卡布奇诺扩展程序:http://github.com/nciagra/Cappuccino-Extensions

它包含一个ActiveRecord端口。我还没有真正关注过这个问题,但它可能对你有帮助。

  • 约翰内斯

答案 3 :(得分:1)

您还可以通过bartolome查看Core Data的这种实现。我只是看了一下,但它看起来像一个开始。

http://github.com/rbartolome/CoreData-Cappuccino