在我的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'
答案 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}}已被弃用。