【问题标题】:Extend NSMutableArray for bi-directional association management扩展 NSMutableArray 用于双向关联管理
【发布时间】:2010-07-06 22:20:25
【问题描述】:

我非常喜欢代码生成(来自 UML)并且来自 Java 世界,我想知道如何在 Objective-C 中实现自动双向关联管理。

图像关联合作伙伴地址,一对多且可从两端导航。我想要实现的是,如果我将地址附加到合作伙伴,地址对象应该自动知道它的合作伙伴。

所以实现模式是在合作伙伴端有一个 NSMutableArray*,在地址端有一个合作伙伴*。 Address 端的属性很容易实现,因为 setPartner:(Partner*)aPartner 可以自动将 Address (self) 插入到管理地址的 Partner 的 NSMutableArray 中。然而,另一方面,实现起来并不容易。 Objective-C 中多引用的标准实现模式似乎是可通过 @property 的 get 方法获得的 NSMutableArray。拥有这个 NSMutableArray 的对象然后可以将 Address 对象插入到数组中,这当然不会更新另一端。

我知道这种关联管理还有其他模式,例如,通过 addTo...() 和 removeFrom...() 方法。但我还不知道这是否符合 Cocoa 编程的其他原则,甚至会阻止我有效地使用 Cocoa。我在这里考虑界面生成器。没有太多经验,但我见过一个叫做 ArrayController 的东西,它看起来很方便,但似乎也期望 NSMutableArray 类型的属性可以使用。如果这家伙将对象插入到数组中,我需要拦截它并进行另一侧调整。

作为一名 Java 程序员,我现在倾向于继承 NSMutableArray 并覆盖它的一些方法,然后这些方法可以操纵另一端。这可能吗?我阅读了有关类别的内容,但到目前为止,我了解到我只能以这种方式将方法添加到一个类中,而不能覆盖它们,也不能添加到它的结构中。还是应该是方法转发?我现在很困惑。如果你能指出我正确的思考方向,那就太好了。非常感谢!

【问题讨论】:

    标签: objective-c cocoa associations bidirectional


    【解决方案1】:

    欢迎来到可可。不要子类化内置集合。你会发疯的。

    请允许我澄清一下:在 Cocoa 中,我们有这些称为 "Class Clusters" 的东西。集群是私有类的层次结构,它们都有一个公共的公共超类。在这种情况下,NSArray 是公共超类,并且有一些私有子类是实际的数组实现。这在子类化时提出了一个非常困难的挑战,因为您不知道需要子类化哪个(或哪些类)。

    常见的解决方法是创建一个新的NSObject 子类,它“包装”NSArray(即,它将数组作为实例变量 ["field"]),然后调用自定义包装器,包装器包含您需要的所有自定义逻辑。

    至于回答您的问题,我发现当我需要自动维护一对一、一对多或多对多关系的这种设置时,什么都没有这比使用 CoreData 更胜一筹。 CoreData 是一个或多或少类似于对象存储的内置框架。它所做的真正令人敬畏的事情之一是处理关系完整性,这正是您正在寻找的。​​p>

    【讨论】:

    • Dave,谢谢你让我免于艰难地学习它——我发誓我永远不会再考虑扩展集合类;)我现在将仔细研究 CoreData。它似乎不支持继承,但对于我的数据模型的大部分部分来说都可以。我希望它可以处理大量数据(二进制形式)。再次感谢!
    • 为什么NSArray 的大量私有子类的存在在子类化时会带来挑战?无论如何,当您显式创建它的实例时,您只会使用自己的子类 - 这不像您要修改现有 Cocoa 方法返回的任何类型 - 所以我看不出其他子类的流行程度以任何方式相关。我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2020-05-12
    相关资源
    最近更新 更多