在NSDocument和UIDocument之间共享代码

时间:2012-03-26 20:26:01

标签: cocoa core-data nsdocument

我创建了一个使用Core Data的基于文档的应用。我首先创建了mac版本,现在它正常工作,我正在继续创建它的iOS版本。

我无法理解如何在iOS / mac版本之间最大化代码重用,相对于Core数据位,因为它们不使用相同的类。

我处理保存的文档类是NSPersistentDocument的子类。我的意图是一个设计良好的模型类应该在两种环境中都能工作,特别是因为我对Core数据没有那么多花哨的东西。

现在,由于iOS中没有NSPersistentDocument,因此我遇到了障碍。我试图通过使用#if TARGET_OS_MAC and TARGET_OS_IPHONE来解决这个问题,并以这种方式使其成为iOS版本中UIManagedDocument的子类。这显然会很方便,但我似乎无法让它像那样工作。而且它看起来非常混乱,因为还有许多其他东西必须被条件化。

我也尝试在NSDocument / UIDocument之上构建类,而不是自己实现Core数据钩子,但它看起来也很混乱,让我觉得这不是正确的方法。< / p>

问题:

对我来说,在iOS / mac版本之间重用相同的文档类似乎是个好主意,但也许我很天真。

最好的方法是什么?

我是否应该忘记代码共享并为iOS版本创建一个单独的文档类来模拟mac版本中的所有方法?

2 个答案:

答案 0 :(得分:3)

我是否认为您想要分享的代码与模型相关?我建议将该代码重构为一个单独的对象,NSDocumentUIDocument都包含该对象(如上面提到的rickster)。

我使用DocumentRoot核心数据实体及其自己的NSManagedObject子类,但如果没有要使用核心数据管理的属性,则可以只将NSObject子类化。

这可能听起来很奇怪,但NSDocumentUIDocument实际上是控制器类。 (具体来说,它们是模型控制器的一部分。)他们的工作是加载模型,设置窗口并保存模型。如果需要为模型对象的更高级别访问提供接口,则可以在文档根目录或模型助手类中。

同样,NSPersistentDocument的工作是配置托管对象上下文和持久性存储,并处理加载和保存。它不一定需要提供访问模型的完整界面。

答案 1 :(得分:2)

(从我的评论中提出这个问题。)

通常,您有两个必须从不同的超类继承但又想要共享大量代码的类的情况是 composition 。将共享代码放在一个单独的类中;您的NSDocumentUIDocument子类可以各自保留该类的实例,并在需要调用该共享代码时向其发送消息。 (尽管@noa提及,您可能想要考虑所有代码是否都属于您的文档类中。)

当然,你最终可能会写出一堆类似的方法:

- (id)doSomething {
    return [sharedController doSomething]
}

这可能会变得很痛苦...所以你可能想要研究一下Objective-C的message forwarding系统。