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

时间:2010-08-09 02:40:45

标签: ipad core-data uitabbarcontroller ios4 uitabbar

我正在构建基于Core Data选项卡的iPad应用程序。我在我的应用程序委托类中使用以下内容将我的NSManagedObjectContext传递到我的根视图。

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

    return YES;    
}

我的问题是:如何在我的所有标签上设置相同的managedObjectContext?如果我可以在app委托中设置我的一些服务类并在我的所有选项卡中使用相同的实例,那也很好。怎么办呢?

提前致谢!

2 个答案:

答案 0 :(得分:4)

“tab”只是另一个视图控制器。当您为每个选项卡启动VC时,您可以使用与设置rootViewController.managedObjectContext完全相同的方式处理托管对象上下文,假设它们具有managedObjectContext属性。

有些人使用单例对象为其类提供Core Data对象;我在我正在处理的应用程序中做的是声明一个协议,CoreDataSource,使用我的NSManagedObjectContext,NSManagedObjectModel和NSPersistentStoreCoordinator的getter,并在我的appDelegate上实现该协议。我需要使用核心数据的视图控制器具有NSObject< CoreDataSource>类型的成员变量,并且当它们彼此创建时,它们设置了该属性。他们实际上都指向我的appDelegate,但是他们不知道,所以他们没有紧密耦合到上游对象。

答案 1 :(得分:2)

最简单的解决方案是为具有managedObjectContext属性的标签视图控制器添加超类,并使用自定义的getter方法:

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

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