0

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

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

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

NSManagedObjectContext *localContext;

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

    localContext = [NSManagedObjectContext MR_contextForCurrentThread];

我最近读到,我应该在 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”

4

1 回答 1

1

如果您的整个应用程序只使用一个托管对象上下文,并且您确定这在未来永远不会改变,那么您实际上可以使用

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext];

在所有视图控制器中。

但是随着嵌套托管对象上下文的引入,Apple 在OS X v10.7 和 iOS 5.0 的核心数据发行说明中建议:

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

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

defaultContext = [NSManagedObjectContext MR_defaultContext];

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

如果您稍后决定更改结构,例如更改为此处所述的多上下文,这将使过渡更容易:http: //www.cocoanetics.com/2012/07/multi-context-coredata/

另请注意, 根据此答案https://stackoverflow.com/a/20536335/1187415MR_contextForCurrentThread已弃用。

于 2014-01-31T19:40:26.747 回答