有没有更好的方法为MagicalRecord定义NSManagedObjectContext定义?

时间:2014-01-31 19:00:07

标签: ios7 magicalrecord-2.2

在我的iOS应用程序的每个类中的每个方法中,除AppDelegate外,我有以下代码行:

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

在我的AppDelegate.h文件中,我有:

NSManagedObjectContext *localContext;

在我的AppDelegate.m文件中我有这个:

    localContext = [NSManagedObjectContext MR_contextForCurrentThread];

我最近在SO中读到我应该在AppDelegate中有一行这样的代码,然后从所有其他类/方法中对它进行多次引用。

如果我将这行代码留在除AppDelegate之外的所有类中,我是否会完成它,但这是最好的方法吗?

更新 这是我添加到AppDelegate.h文件中的代码:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectContext *localContext;

这是我添加到AppDelegate.m文件中的代码:

//  set default MagicalRecord context in all View Controllers
UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;

UINavigationController *nc = tbc.viewControllers[0];
CalendarViewController *cvController = (CalendarViewController *)nc.topViewController;
cvController.localContext = self.managedObjectContext;

nc = tbc.viewControllers[1];
WeeksApptsViewController *waController = (WeeksApptsViewController *)nc.topViewController;
waController.localContext = self.managedObjectContext;

nc = tbc.viewControllers[2];
CustomerSetupController *csController = (CustomerSetupController *)nc.topViewController;
csController.localContext = self.managedObjectContext;

nc = tbc.viewControllers[3];
AppointmentsViewController *avController = (AppointmentsViewController *)nc.topViewController;
avController.localContext = self.managedObjectContext;

nc = tbc.viewControllers[5];
SettingsViewController *sController = (SettingsViewController *)nc.topViewController;
sController.localContext = self.managedObjectContext;

当我在调试器中运行应用程序时,它会在这行代码中崩溃:

    CalendarViewController *cvController = (CalendarViewController *)nc.topViewController;

带有以下消息:

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [CalendarViewController viewControllers]:无法识别的选择器发送到实例0xb67ed40'

1 个答案:

答案 0 :(得分:1)

如果您的整个应用仅使用一个托管对象上下文, 并且您确定将来永远不会更改, 然后你可以实际使用

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext];

在所有视图控制器中。

但随着嵌套托管对象上下文的引入, Apple建议使用Core Data Release Notes for OS X v10.7 and iOS 5.0

  

嵌套上下文比以往任何时候都更重要   “传递接力棒”访问上下文的方法(通过传递上下文   从一个视图控制器到下一个视图控制器而不是检索它   直接来自应用程序代理。

在最简单的情况下,您将获得指向AppDelegate中的默认上下文的指针:

defaultContext = [NSManagedObjectContext MR_defaultContext];

并将此上下文从AppDelegate传递到第一个视图控制器,然后从那里传递 到下一个视图控制器(例如,在使用Storyboard时在prepareForSegue中), 等等。

如果您稍后决定更改结构,那么转换会更容易 例如到这里描述的多上下文:http://www.cocoanetics.com/2012/07/multi-context-coredata/

另请注意,根据这个答案https://stackoverflow.com/a/20536335/1187415, {@ 1}}已被弃用。