2012-09-07 42 views
4

我刚刚开始使用CoreData创建应用程序,但我熟悉MVC概念,因为我曾经在使用(和开发)MVC框架的Web开发中做了很多工作。iOS MVC:模型适合CoreData应用程序?

从我收集的内容中,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。

+0

伟大的问题! – Chris

回答

2

从我收集的内容来看,CoreData会自动生成从NSManagedObject继承的类。

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

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

这取决于应用程序。如上所示,如果您希望给定的实体映射到您提供的NSManagedObject子类,那么可以这样做。如果您希望数据对象包含的方法不仅仅是实体属性的访问器,那将会非常有用。例如,您可以实施-compare:方法以便按特定顺序排序,或者使用-getCurrentImage方法从Web服务器检索产品图像。此外,您的模型可能包含一个或多个模型控制器类,它们处理诸如提取请求之类的事情,以便程序的其余部分甚至不需要意识到该模型使用核心数据。

应用程序可能需要的其他功能与数据交易, 没有分配CoreData对象......如果一个CoreData 应用程序需要填充的是通过一个HTTP请求检索 数据表视图来自foo.com/test

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

+0

在我继承的项目中,每个实体都有一个类。 'Person:NSManagedObject'等。它们似乎是自动生成的,它们都没有方法。它们只是构造函数和'@ dynamic'属性。一个开发者(不再有)向我展示了生成这些类的XCode菜单中的东西,但我不记得它在哪里...... –

+0

它是Xcode,而不是核心数据,它生成这些类,是的,它是基本上只是根据你指定的实体创建一个类。 (在您的模型中选择一个实体,并使用Editor-> Create NSManagedObject Subclass。)如果您希望如上所述向给​​定实体添加行为,则可以使用该工具;如果你的项目中的类是空的,你可以直接使用NSManagedObject。 – Caleb

+0

我明白了,谢谢。在接受答案之前,要稍微等待一些意见。生成的类比使用NSManagedObject更好,因为它们会被强类型化?它也会使更具可读性的代码,是吗? –

相关问题