这是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添加了一些设置反向关系的方法。但我担心我做了很多毫无意义的工作,并且已经有了一种更简单的方法。
有人可以让我的担忧得到休息吗?
答案 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的这种实现。我只是看了一下,但它看起来像一个开始。