2012-03-26 95 views
4

我已经创建了一个使用Core Data的基于文档的应用程序。我首先创建了mac版本,现在它工作正常,我正在创建它的iOS版本。在NSDocument和UIDocument之间共享代码

我只是无法弄清楚如何最大化iOS/mac版本与Core数据位之间的代码重用,因为它们不使用相同的类。

我的文档类处理保存,这是NSPersistentDocument的子类。我的意图是,一个设计良好的模型类应该可以在两种环境中工作,特别是因为我不会在Core数据方面做所有的事情。

现在,由于NSPersistentDocument不适用于iOS,因此我撞墙了。我试图通过使用#if TARGET_OS_MAC and TARGET_OS_IPHONE来解决这个问题,并且以这种方式使它成为iOS版本中的UIManagedDocument的子类。这显然会很方便,但我似乎无法像这样工作。它看起来非常混乱,因为还有很多其他的东西需要进行条件化。

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

问题:

对我来说,这似乎是一个好主意,重新使用的iOS/Mac版之间相同的文档类,但也许我太天真。

这样做的最好方法是什么?

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

+1

我不能说这个特定的场景,但是考虑一般情况可能会有所帮助:你有两个类必须从不同的超类继承,但你有你想要在它们之间共享的代码。这种(在ObjC中)的通常答案是组合:将共享代码放入不同的类中,并从两者中引用该类的实例。 – rickster 2012-03-26 22:51:34

+0

这似乎是一个好主意。请发布是一个答案,我会选择它。一个后续问题,似乎我在我的复合对象中编写20-30个方法,只将它们转发到专用接收方的完全相同的方法。有没有更好的方法? – Frost 2012-03-27 15:40:37

回答

2

(从我的评论在将这一)

一般来说,在那里你有必须从不同的超类,但也想分享大量的代码是组成继承两个类的情况。将共享代码放在一个单独的类中;您的NSDocumentUIDocument子类可以分别保留该类的一个实例,并在需要调用该共享代码时向其发送消息。 (尽管@noa提到,你可能要考虑是否所有的代码都属于你的文档类,以开头。)

当然,那么你最终可能会写一堆方法,如:

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

这可能会成为一个痛苦...所以你可能想看看Objective-C的message forwarding系统。

+0

给未来的读者的提示:我选择这个作为问题的答案,但是在我看到有很多转发方法需要编写并保持更新之后,我不得不放弃它。相反,我为iOS和Mac实现保留了单独的类,因为它似乎更实用。 – Frost 2012-04-14 07:48:07

3

我说对了,你想分享的代码与模型有关吗?我建议将该代码重构为一个单独的对象,其中包含NSDocumentUIDocument(如上面建议的rickster)。

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

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

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

相关问题