访问ManagedObjectContext

时间:2013-08-10 16:56:48

标签: ios objective-c core-data nsmanagedobjectcontext

我正在将Core Data集成到一个不是使用Core Data模板创建的应用程序中。我遇到了这方面的问题,可能有一个非常简单的答案。但是,由于大多数关于这个主题的教程都是针对使用模板的,所以我很难过。

我已经按照建议创建了一个选中Core Data的简单应用,并将生成的代码复制到我现有的应用中。但是,我无法弄清楚如何访问AppDelegate之外的NSManagedObjectContext。我有几个视图控制器,我需要访问托管对象上下文。

我复制到应用程序中的生成代码放在AppDelegate中,以及.pch文件中对CoreData的引用。我错过了什么吗?如何访问托管对象上下文?

谢谢! V

2 个答案:

答案 0 :(得分:5)

我遇到了几周前你面临的同样问题。根据我的研究,我发现通过让AppDelegate将ManagedObjectContext传递给您想要访问它的类来避免僵化是一种最佳实践。你可以这样做:

在.h文件中为要访问managedObjectContext的类创建一个属性:

@property (nonatomic, strong) NSManagedObjectContext  *managedObjectContext;

然后合成:

@synthesize managedObjectContext;

将managedObjectContext分配给AppDelegate中didFinishLaunchingWithOptions:方法中的实例变量:

MyClass.managedObjectContext = self.managedObjectContext;

可能有更好的方法可以实现这一目标,但它对我来说效果很好。此外,我的类/视图控制器不需要了解任何有关AppDelegate的信息。

修改:根据以下评论删除了setter方法。

答案 1 :(得分:3)

您可以通过多种方式在应用中共享对象上下文。请注意,您需要确保不在不同的线程上使用上下文;如果你想在后台和前台线程中使用Core Data,你将不得不添加一些复杂功能。

您使用的选项取决于您:

  • 我通常将Core Data对象(持久性存储协调器,托管对象模型,前台和后台线程的上下文)移动到单个对象中,因此任何需要它的类都可以获取对象而不会增加向上依赖性的方式
  • 您可以使用依赖注入将上下文传递到视图控制器中,同时在应用程序委托中创建它们,并从这些视图控制器下载到需要它们的其他对象中。
  • 您可以在app delegate的标题中公开Core Data getter;然后在你的课程中,你可以使用[[UIApplication sharedApplication] delegate]获得app委托,并直接从app delegate获取CD对象(我不喜欢这种方法,但它可能涉及最少的代码更改)。