我非常喜欢代码生成(来自UML)并来自Java世界,我想知道如何在Objective-C中实现自动双向关联管理。
图片关联合作伙伴< - >地址,一对多,可从两端导航。我想要实现的是,如果我向合作伙伴附加地址,地址对象应该自动了解其合作伙伴。
所以实现模式是在Partner端有一个NSMutableArray *,在Address端有一个Partner *。地址侧的属性很容易实现,因为setPartner :( Partner *)aPartner可以自动将地址(self)插入到管理地址的Partner的NSMutableArray中。然而,另一方面并不那么容易实施。 Objective-C中to-many引用的标准实现模式似乎是通过@property的get方法可获得的NSMutableArray。拥有此NSMutableArray的对象然后可以将一个Address对象插入到数组中,这当然不会更新另一方。
我知道这种关联管理还有其他模式,例如,通过addTo ...()和removeFrom ...()方法。但我还不知道这是否符合Cocoa编程的其他原则,甚至阻止我有效地使用Cocoa。我在这里考虑Interface Builder。没有多少经验,但我看到了一个名为ArrayController的东西,它看起来非常方便,但似乎也期望使用NSMutableArray类型属性。如果这个人将对象插入到数组中,我需要拦截它并进行另一侧调整。
作为一名Java程序员,我倾向于现在继承NSMutableArray并覆盖它的一些方法,然后可以操纵另一端。这有可能吗?我读到了类别,但到目前为止我已经明白我只能以这种方式将方法添加到类中,而不是覆盖它们,也不会添加到它的结构中。或者它应该是方法转发?我现在很困惑。如果你能指出我正确的思考方向,那就太棒了。非常感谢!
答案 0 :(得分:9)
欢迎来到Cocoa。不要子类化内置集合。你会疯了。
请允许我澄清一下:在Cocoa中,我们将这些东西称为"Class Clusters"。集群是私有类的层次结构,它们都具有公共的超类。在这种情况下,NSArray
是公共超类,并且有私有子类是实际的数组实现。这在子类化时提出了一个非常困难的挑战,因为你不知道你需要继承哪些类(或类)。
常见的解决方法是创建一个新的NSObject
子类“包装”NSArray
(即,它将数组作为实例变量[“field”]),然后你调用自定义包装器上的方法,包装器包含您需要的所有自定义逻辑。
至于回答你的问题,我发现当我有这种设置需要自动维持一对一,一对多或多对多的关系时,我什么都没有使用CoreData击败。 CoreData是一个内置框架,或多或少像一个对象存储。它所做的真正令人敬畏的事情之一是处理关系完整性,这正是您正在寻找的。 p>