时间:2010-07-26 14:14:17

标签: iphone core-data

2 个答案:

答案 0 :(得分:6)

我通常创建一个专用对象来管理我的核心数据堆栈以及相关的对象和行为。这很有用,因为有很多带有Core Data的样板,所以我可以创建一个通用的基类管理器类,然后为每个应用程序使用一个子类。我通常称它为AppNameDataModel。

我更喜欢在DataModel对象中隐藏托管对象上下文。这会强制应用程序中的其他对象请求DataModel对象访问Core Data堆栈,从而提供良好的封装和安全性。

通常,我在DataModel类中创建方法以返回实体的提取,例如

-(NSFetchRequest *) entityNameFetch;

...然后在DataModel中有一个performFetch方法。在使用中,控制器要求获取实体,配置获取,然后要求DataModel执行获取并返回结果。您可以编写返回fetch的方法的生成脚本,并且perform fetch也是样板。这样可以节省大量时间,特别是在原型设计时。

对DataModel实例本身的引用可以从控制器传递给控制器​​,但我认为这是单例模式的有效使用,因此我经常使DataModel成为单例,并在UIViewController上为属性访问它提供一个类别。这意味着我添加到项目的任何视图控制器都可以自动访问DataModel。

这种模式可以很好地封装和模块化。它可以轻松添加新视图或在项目之间共享数据模型。最初设置需要一些工作,但是一旦你有了基类,未来的使用就会大量增加。

答案 1 :(得分:2)

感谢Brad指出这个问题。

如Apple文档[1]所述,必须将上下文传递给需要CoreData的每个新视图控制器。

  

在iPhone上:

     

按照惯例,您通常可以从视图控制器获取上下文。但是,你应该遵循这种模式。   实现与Core Data集成的视图控制器时,可以添加NSManagedObjectContext属性。

     

视图控制器通常不应从全局对象(例如应用程序委托)检索上下文。这往往会使应用程序架构变得僵硬。视图控制器通常也不应为自己的用途创建上下文。这可能意味着使用控制器上下文执行的操作未在其他上下文中注册,因此不同的视图控制器将对数据有不同的视角。

     

创建视图控制器时,会向其传递上下文。您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文。应用程序委托通常负责创建一个上下文以传递给显示的第一个视图控制器。

[1] - http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283