什么时候调用appdelegate的managedObjectContext

时间:2011-10-20 14:00:50

标签: iphone objective-c cocoa-touch

访问managedObjectContext的最佳方法是什么。根据这个post,我不应该在finishedLoad:方法中这样做。

从我的应用程序的任何模型以这种方式访问​​我的managedObjectContext是一个好习惯:

(MyAppDelegate *)[[UIApplication sharedApplication]委托])。managedObjectContext

3 个答案:

答案 0 :(得分:2)

我同意Wienke。在application:didFinishLaunchingWithOptions:中访问核心数据堆栈没有任何问题,只要您不在该方法中启动处理数据。您应该加载一个新的视图控制器,设置其托管对象上下文,并在该视图加载后异步启动该过程。

我不清楚您是否尝试访问应用委托中的托管对象上下文,或者您是否尝试从其他类访问它。如果您从其他类访问它,您建议的代码会创建紧密耦合,从而降低代码的可重用性。更好的做法是在实例化类时设置属性。 编写视图控制器类时,请确保为视图控制器设置合成属性:

// CustomViewControllerClass.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

// CustomViewControllerClass.m
@synthesize managedObjectContext = __managedObjectContext;

在app delegate中加载视图控制器时,将app delegate的托管对象上下文传递给视图控制器:

// MyAppDelegate.m (inside application:didFinishLaunchingWithOptions:)
        CustomViewController *controller = (CustomViewController *)masterNavigationController.topViewController;
        controller.managedObjectContext = self.managedObjectContext;

这样,如果您的应用程序委托中没有设置Core Data堆栈,那么您的自定义类可以轻松地从任何类实例化它来接受托管对象上下文。

答案 1 :(得分:0)

我认为您可以从应用中任何类的任何方法访问上下文,并且您显示的语法应该可以正常工作 - 如果您在开头添加另一个开头的话。

在你提到的帖子中,我认为Zarra先生没有建议反对来自applicationDidFinishLaunching的任何访问上下文。他警告你不要在此时使用上下文来处理整个数据库中的更改或获取大量数据。如果您需要访问一个或两个托管对象,以便在applicationDidFinishLaunching中指导您的UI显示,那应该没问题。

答案 2 :(得分:0)

看看我对这篇文章的回答:

Passing managedObjectContext - is this efficient?

基本上,我使用Matt Gallagher的宏创建一个单例,并在任何地方访问:

[[MyPersistentStoreController sharedMyPersistentStoreController] managedObjectContext]];

您可以在上面的链接中找到所有详细信息以及Matt帖子的链接。