分享NSManagedObjectContext和iphone/ipad标签之间的其他服务类

问题描述:

我很好地构建了基于Core Data标签的iPad应用程序。我使用我的应用程序委托类中的以下内容将NSManagedObjectContext传递给我的根视图。分享NSManagedObjectContext和iphone/ipad标签之间的其他服务类

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

    return YES;  
} 

我的问题是:如何在我的所有选项卡上设置相同的managedObjectContext?如果我可以在应用程序委托中设置一些服务类并在所有选项卡中使用相同的实例,那也是一件好事。如何才能做到这一点?

提前致谢!

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

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

+0

我无法看到每个标签的每个VC的初始化方式/位置。要添加选项卡,我只需在选项卡控制器下添加另一个选项并将其指向VC。 – 2010-08-09 06:26:17

+0

你不需要他们的init,你可以在AppDelegate的'-applicationDidFinishLaunching ...'方法中处理它。抓住'UITabbarController'并迭代它的'-viewControllers'。 – 2010-08-09 16:31:17

+0

Marcus - 是的,我的意思是在-applicationDidFinishLaunching - 当我使用标签控制器时,我创建并手动添加了标签。无论哪种方式,我同意你的看法,这是DI的合适地点。 – 2010-08-09 16:54:48

最简单的解决方案是增加超类为你标签视图控制器,带有managedObjectContext属性,如自定义getter方法:

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

如果所有的标签视图控制器继承了这个方法,他们都会自动查找应用程序委托的托管对象上下文。你完成了。

+1

我们仍然不同意使用Singletons :)我发现应用程序启动时的依赖注入是一个更好的解决方案。 – 2010-08-09 16:30:12

+0

@Marcus S. Zarra - 依赖注入可能会更好,但新手实现起来并不简单。我发现新手在跟踪视图控制器层次结构时遇到问题,并且这会解决这个问题,特别是在标签栏的情况下。 – TechZen 2010-08-09 19:41:41

+0

我一直是第一个击中深度的粉丝:) – 2010-08-09 21:55:36