【问题标题】:iOS MVC: where does the model fit-in to a CoreData application?iOS MVC:模型在哪里适合 CoreData 应用程序?
【发布时间】:2012-09-01 16:15:24
【问题描述】:

我刚刚开始使用 CoreData 制作应用程序,但我熟悉 MVC 概念,因为我曾经使用(和开发)MVC 框架在 Web 开发方面做了大量工作。

据我所知,CoreData 会自动生成继承自 NSManagedObject 的类。对象是通过对上下文的获取请求或通过将新对象插入上下文来创建的。在我见过的应用程序中,除了与它们在数据库中的属性相对应的属性之外,这些对象都是空的,基本上使它们成为模仿实体表中的一行的对象。

这些自动生成的类和 CoreData 本身构成了应用程序模型,这是有道理的。在我传统上制作的应用程序中,有一个 Model 类负责处理所有数据。这通常是一个 Singleton 类,每个需要模型的控制器都可以简单地使用self.model = [Model sharedInstance];。对于更大的应用程序,可能有多个模型而不是一个巨大的模型。你得到图片。我想我的第一个问题是:我说的对吗? CoreData 及其关联的 NSManagedObject 构成了应用程序的整个模型?

我猜这是错误的,因为应用程序可能需要其他功能来处理没有分配的 CoreData 对象的数据。例如:如果 CoreData 应用程序需要使用通过来自 foo.com/test 的 HTTP 请求检索到的数据(假设它是 JSON 数据)来填充表视图,该怎么办。这些数据不需要存储在 CoreData 中,但同时,我不认为检索和解析数据是控制器的工作。如果有一个对象,FooDataManager(或类似的东西)来处理 HTTP 请求以管理来自 foo.com 的数据(它可以扩展 AFHTTPClient)。然后处理 foo.com 的控制器有一个fooDataManager 的属性,它充当该控制器的模型?然后控制器会调用[self.fooDataManager retrieveAndParseData];?

我想在开始开发 CoreData 应用程序之前验证这些信息,以便我从一开始就正确地完成它。在 Web 开发中,我习惯于每个控制器都有一个模型,但在 iOS 上,似乎可以有很多模型都做自己的事情,许多控制器使用这些模型,所有这些模型都是附加的到 CoreData 和 NSManagedObjects。

【问题讨论】:

    标签: objective-c ios model-view-controller core-data model


    【解决方案1】:

    据我所知,CoreData 自动生成的类 继承自 NSManagedObject。

    没有。除非您指定给定实体使用您编写的 NSManagedObject 子类,否则 Core Data 返回的对象是 NSManagedObject 的实例。

    我想我的第一个问题是:我说的对吗? CoreData 及其关联 NSManagedObject 构成了应用程序的整个模型?

    这取决于应用程序。如上所述,如果您希望给定实体映射到您提供的 NSManagedObject 子类,您可以这样做。如果您希望数据对象包含实体属性的访问器之外的方法,这将很有用。例如,您可以实现-compare: 方法以方便按特定顺序进行排序,或者实现-getCurrentImage 方法从Web 服务器检索产品图像。此外,您的模型可能包含一个或多个模型控制器类来处理诸如获取请求之类的事情,因此程序的其余部分甚至不需要知道模型使用 Core Data。

    应用程序可能需要其他处理数据的功能 没有分配的 CoreData 对象...如果 CoreData 应用程序需要使用检索到的数据填充表视图 通过来自 foo.com/test 的 HTTP 请求

    您绝对可以将该功能放在一个单独的类中,并将其视为您的模型的一部分,我认为这可能是个好主意。许多 iOS 程序员可能会因为它看起来很方便而将它放在视图控制器中,但我同意将它作为模型的一部分是一个更好的计划。

    【讨论】:

    • 在我继承的项目中,每个实体都有一个类。 Person : NSManagedObject等。它们似乎是自动生成的,它们中没有一个有方法。它们只是构造函数和@dynamic 属性。一位开发人员(不再在那里)向我展示了 XCode 菜单中生成这些类的东西,但我不记得它在哪里......
    • 生成这些类的是 Xcode,而不是 Core Data,是的,它基本上只是根据您指定的实体创建一个类。 (在模型中选择一个实体并使用 Editor->Create NSManagedObject Subclass。)当您想将行为添加到给定实体时,您可以使用该工具,如上所述;如果你的项目中的类是空的,你可以直接使用 NSManagedObject。
    • 我明白了,谢谢。在接受答案之前,要等待更多的意见。生成类是否比使用 NSManagedObject 更好,因为它们将被强类型化?它也会使代码更具可读性,是吗?
    猜你喜欢
    • 2011-06-01
    • 2012-07-18
    • 2011-03-22
    • 2010-09-16
    • 2013-07-29
    • 2012-04-22
    • 1970-01-01
    • 2019-11-06
    • 2011-12-21
    相关资源
    最近更新 更多