Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 管理没有CoreData的反向关系_Cocoa_Oop_Cappuccino_Objective J - Fatal编程技术网

Cocoa 管理没有CoreData的反向关系

Cocoa 管理没有CoreData的反向关系,cocoa,oop,cappuccino,objective-j,Cocoa,Oop,Cappuccino,Objective J,这是Objective-J/Cappuccino的一个问题,但我添加了cocoa标签,因为框架非常相似 Cappuccino的一个缺点是CoreData尚未移植,因此您必须手动创建所有模型对象 在CoreData中,您的反向关系将自动为您管理。。。如果将一个对象添加到另一个对象的对多关系中,则可以在两个方向上遍历图形 如果没有CoreData,是否有任何干净的方法自动设置这些反向关系 更具体的例子,让我们以典型的部门和员工为例。使用rails术语,Department对象有许多雇员,雇员属于某个

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

Cappuccino的一个缺点是CoreData尚未移植,因此您必须手动创建所有模型对象

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

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

更具体的例子,让我们以典型的部门和员工为例。使用rails术语,Department对象有许多雇员,雇员属于某个部门

因此,我们的部门模型有一个NSMutableSet(或CPMutableSet)“employees”,它包含一组员工,而我们的员工模型有一个变量“Department”,它指向拥有它的部门模型

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

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


有人能消除我的顾虑吗?

我不能专门对Objective-J说话,但在没有核心数据的情况下,通常的做法是在setter中设置反向关系。因此,使用员工/部门示例,您可以执行以下操作:

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

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

    [department addEmployee:self];
}
如果新值已与现有值匹配,则需要确保不更新实例变量。如果不这样做,
setDepartment:
将调用
addEmployee:
,而
addEmployee:
将在无限循环中调用
setDepartment:


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

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

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

    [department addEmployee:self];
}
如您所见,不需要保留/释放。Objective-J是基于javascript构建的,javascript是垃圾收集的。所有的内存管理方法都实现了,但什么也不做(除了让代码变得混乱)


此外,由于这是javascript,因此通常建议检查类型相等(==)有关类型相等的更多信息,请参见:

查看此280 North员工的Cappuccino扩展:

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

  • 约翰尼斯

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


谢谢,我基本上就是这么做的。(除了在任何一方发生变化时使用KVO触发,并添加另一方)因此,看起来我走上了正确的轨道,谢谢。如果这是你正在做的,那么你走上了正确的轨道。我认为我的方法可能会简单一点,只是因为执行KVO的开销,但是任何一种方法都应该可以很好地工作。我使用KVO的主要原因是我没有修改生成的访问器的权限。相反,在我的init方法中,我调用了一个描述关系类型、要使用的属性以及反向关系属性的方法。这会自动设置观察者,等等。我会在完成所有工作后共享代码。是的,不必担心保留/发布很好。我会记住类型平等,谢谢!这看起来很酷,我还需要进一步探索。除非我弄错了,否则我认为它负责服务器端的大部分验证等。当然,这很重要,但我认为进行客户端验证也很重要,可以为用户提供快速体验。