2

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

Cappuccino 的缺点之一是尚未移植 CoreData,因此您必须手动制作所有模型对象。

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

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

对于更具体的示例,让我们以典型的部门和员工示例为例。要使用 Rails 术语,Department 对象有许多员工,而 Employee 属于一个部门。

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

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

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

有人可以解决我的担忧吗?

4

4 回答 4

2

查看来自 280 North 员工的卡布奇诺扩展:http: //github.com/nciagra/Cappuccino-Extensions

它包括一个 ActiveRecord 端口。我实际上还没有仔细研究过这些,但它可能会对你有所帮助。

  • 约翰内斯
于 2009-10-06T06:59:31.760 回答
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。所以我的例子可能不是最好的,因为说部门“拥有”员工可能更准确。

于 2009-10-05T18:50:01.227 回答
2

您可能想在您的设置器中设置关系。使用您的示例,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

于 2009-10-05T19:33:07.220 回答
1

您还可以查看 rbartolome 的 CoreData 实现。我只看了一点,但它看起来像一个开始。

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

于 2010-06-13T20:58:36.533 回答