摘要NSManagedObject和NSDictionary

时间:2010-01-29 19:05:34

标签: iphone core-data abstraction duplicate-data nsmanagedobject

在我的项目中,我有一些从服务器上显示的对象,我们称之为Foo。当我得到我的Foo feed时,我将它们解析为一个名为RemoteFoo的NSMutableDictionary子类,并在应用程序周围传递这些RemoteFoo对象以显示数据。

如果用户最终想要下载RemoteFoo,我会创建一个名为Foo的核心数据NSManagedObject实体,并使用RemoteFoo中的值对其进行实例化。这一切都有效。

我遇到的问题是如果我想要一个方法在RemoteFoo和Foo上运行,我必须在RemoteFoo.m和Foo.m中复制它。此外,我的应用程序如果充满重复的init,如:

- (id)initWithFoo:(Foo *)foo;
- (id)initWithRemoteFoo:(RemoteFoo *)foo;

如何将临时远程RemoteFoo与代表用户本地保存的Foo的核心数据Foo实体分开,以避免所有这些代码复制?

3 个答案:

答案 0 :(得分:3)

您是否考虑使用类集群之类的东西 -

http://seanmurph.com/weblog/make-your-own-abstract-factory-class-cluster-in-objective-c/

    --------- Foo --------          NSManagedObject
    |                    |                 |
RemoteFoo             LocalFoo ------ CoreDataFoo 

答案 1 :(得分:2)

您可以将所有RemoteFoo保存为Foo并使用它们。如果你需要不同的行为,你可以在Foo上有一个属性,表明它是否是远程的。

答案 2 :(得分:1)

按如下方式更改核心数据模型。使用一个Foo实例并添加一个默认设置为NO的布尔属性isRemote(或类似的东西)。下载远程对象时,将它们实例化为Foo托管对象,并将其isRemote属性设置为yes。

这样,您只需处理应用中的一个实例,同时保留清晰区分本地和远程Foo对象的能力。如果您的应用允许这样做,您甚至可以将isRemote属性声明为瞬态,以便它永远不会存储在磁盘上,只存储在内存中。如果你不小心坚持这些信息,那么这可能是最好的方法。