【问题标题】:Abstracting NSManagedObject and NSDictionary抽象 NSManagedObject 和 NSDictionary
【发布时间】:2010-01-29 19:05:34
【问题描述】:

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

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

我遇到的问题是,如果我想要一个方法在 RemoteFoo 和 Foo 上运行,我必须在 RemoteFoo.m 和 Foo.m 中复制它。另外,如果我的应用充满了重复的初始化,就像:

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

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

【问题讨论】:

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


    【解决方案1】:

    你有没有想过使用类集群之类的东西 -

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

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

    【讨论】:

    • 嗨,这绝对是我想要的方式,但核心数据实体必须是 NSMangedObject 的子类
    • 我知道这有点乱,但是在核心数据实体和 Foo 类集群中的类之间不可能有一个中介吗?我将在我的帖子中添加一个小图表我觉得我应该添加免责声明,我现在很困很饿 - 所以我的回答可能有点疯狂!
    • LocalFoo 和 CoreDataFoo 之间的交互如何准确地工作?您能否举一些简短的例子来说明 MediatorFoo 的工作原理及其连接方式?
    • 那么 LocalFoo 可以将消息从 Foo 转发到 CoreDataFoo 并将数据从 CoreDataFoo 传回给 Foo。
    【解决方案2】:

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

    【讨论】:

    • RemoteFoos 不断变化,并通过应用程序中的多个点以多种方式从服务器的各种列表中请求。如果我将它们全部保存,我将不得不不断更新我拥有的每条 Foo 记录,因为每个 RemoteFoo 的详细信息可能会发生变化。我认为这会给我的应用程序的性能增加很多开销。更不用说有数千个 RemoteFoo,但用户会下载的只有几十个 Foo。
    • 这绝对是最简单的方法……你认为使用它会像我在上面评论中描述的那样对性能造成影响吗?
    • Core Data 已针对性能进行了重大调整。您自己使用自制解决方案无法比使用 CoreData 更有效率。
    【解决方案3】:

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

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

    【讨论】:

    • 这个答案类似于 Jaanus,但我不知道瞬态选项。这听起来很吸引人,因为 RemoteFoos 通常不会在单个会话中更改,因此保存到内存听起来不错。我将对此进行更多研究
    • 嗯,我看错了。我认为整个 Foo 可以是瞬态的,但只有列可以。
    猜你喜欢
    • 2010-12-02
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多