在iphone/ipad选项卡之间共享NSManagedObjectContext和其他服务类

在iphone/ipad选项卡之间共享NSManagedObjectContext和其他服务类,ipad,core-data,uitabbarcontroller,ios4,uitabbar,Ipad,Core Data,Uitabbarcontroller,Ios4,Uitabbar,我对构建基于核心数据标签的iPad应用程序非常感兴趣。我正在我的应用程序委托类中使用以下命令将NSManagedObjectContext传递到我的根视图 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.rootViewController.managedObjectContext = self.m

我对构建基于核心数据标签的iPad应用程序非常感兴趣。我正在我的应用程序委托类中使用以下命令将NSManagedObjectContext传递到我的根视图

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    self.rootViewController.managedObjectContext = self.managedObjectContext;
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    return YES;    
}
我的问题是:如何在所有选项卡上设置相同的managedObjectContext?如果我可以在app delegate中设置一些服务类,并在我的所有选项卡上使用相同的实例,那也很好。如何做到这一点

提前谢谢

选项卡只是另一个视图控制器。在为每个选项卡启动VCs时,您可以按照与设置rootViewController.managedObjectContext完全相同的方式向它们传递托管对象上下文,前提是它们具有managedObjectContext属性


有些人使用单例对象为他们的类提供核心数据对象;我在目前正在开发的应用程序中所做的是为我的NSManagedObjectContext、NSManagedObjectModel和NSPersistentStoreCoordinator声明一个协议CoreDataSource,并在我的appDelegate上实现该协议。需要使用核心数据的“我的视图”控制器具有NSObject类型的成员变量,并且在它们相互创建时设置属性。它们实际上都指向我的appDelegate,但它们不知道,因此它们没有与上游对象紧密耦合。

最简单的解决方案是为选项卡视图控制器添加一个带有
managedObjectContext
属性和自定义getter方法的超类,如:

- (NSManagedObjectContext *) managedObjectContext{
    if (managedObjectContext !=nil) {
        return managedObjectContext;
    }
    MyAppDelegateClass *appDelegate=(MyAppDelegateClass *)[[UIApplication sharedApplication] delegate];
    self.managedObjectContext=appDelegate.managedObjectContext;
    return managedObjectContext;
}

如果所有选项卡视图控制器都继承此方法,则它们都将自动查找应用程序委托的托管对象上下文。你完成了。

我看不出每个VC在每个选项卡上是如何初始化的。要添加选项卡,我只需在选项卡控制器下添加另一个对象并将其指向VC。您不需要它们的初始化,您可以在AppDelegate的
-applicationdFinishLaunching…
方法中处理它。抓取
UITabbarController
并在其
-viewControllers
上迭代。Marcus——是的,我是指在-applicationdFinishLaunching中——当我使用选项卡控制器时,我已经手动创建并添加了选项卡。不管怎样,我同意你的观点,那是DI的正确位置。非常感谢你的回答!我们仍然不同意使用单例:)我发现应用程序启动时的依赖注入是一个更好的解决方案。@Marcus S.Zarra——依赖注入可能更好,但对于新手来说实现起来并不简单。我发现新手很难跟踪视图控制器的层次结构,这就解决了这个问题,尤其是在标签栏的情况下。我一直喜欢先触及深层次:)很好的答案,伙计们!我掷了一枚硬币,将依赖注入答案标记为已接受答案。