2009-10-05 39 views
2

这是一个Objective-J/Cappuccino的问题,但我添加了可可标记,因为框架非常相似。管理没有CoreData的逆关系

卡布奇诺的缺点之一是CoreData尚未被移植过,因此您必须手动创建所有模型对象。

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

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

有关更具体的示例,我们以典型的Department和Employees示例为例。要使用rails术语,Department对象具有许多Employees和Employee属于Department。

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

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

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

有人可以把我的顾虑休息吗?

回答

2

我不能专门讲Objective-J,但没有核心数据的通常做法是在setter中设置反比关系。因此,使用员工/部门的例子,你会做这样的事情:

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

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

    [department addEmployee:self]; 
} 

你需要确保如果新值已符合现有的价值,你不更新你的实例变量。如果您没有,setDepartment:会调用addEmployee:,并且addEmployee:会以无限循环调用setDepartment:

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

+0

谢谢,这基本上是我在做什么。 (除了使用KVO触发任何一方改变时,并添加另一方。) 因此,它看起来像我在正确的轨道上,谢谢。 – 2009-10-05 19:17:20

+0

如果这就是你正在做的事,你就走在正确的轨道上。我认为我的方法可能会稍微简单一点,因为要做KVO的开销,但任何一种方式都应该正常工作。 – Alex 2009-10-05 19:35:09

+0

我使用KVO的主要原因是我没有修改生成的访问器。 相反,在我的init方法中,我调用一个方法来描述关系的类型,使用哪个属性以及属性的逆关系。这会自动设置观察者等。 我将在我完成所有工作后共享代码。 – 2009-10-05 19:38:27

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

+0

是的,不必担心保留/释放是很好的。 我会记住类型的平等,谢谢! – 2009-10-05 19:58:03

2

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

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

  • 约翰内斯
+0

看起来非常酷,我将不得不探索更多。除非我弄错了,否则我认为它会考虑服务器端的大部分验证等。这当然很重要,但我认为做客户端验证也很重要,以便为用户提供快速体验。 – 2009-10-06 15:07:27