【问题标题】:Is there a better way to define NSManagedObjectContext definitions for MagicalRecord?有没有更好的方法来为 MagicalRecord 定义 NSManagedObjectContext 定义?
【发布时间】:2014-01-31 19:00:06
【问题描述】:

在我的 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”

【问题讨论】:

  • 您应该检查所有视图控制器的实际类。从tbc = self.window.rootViewController 开始。那真的是 UITabBarController 吗?然后检查nc = tbc.viewControllers[0] 这真的是 UINavigationController 吗?等等...... - 我的猜测是第一个选项卡上的 CalendarViewController 没有嵌入到导航控制器中。在这种情况下,CalendarViewController *cvController = tbc.viewControllers[0]; 应该可以工作。

标签: ios7 magicalrecord-2.2


【解决方案1】:

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

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext];

在所有视图控制器中。

但是随着嵌套托管对象上下文的引入, 苹果推荐在Core Data Release Notes for OS X v10.7 and iOS 5.0

嵌套上下文使得采用 访问上下文的“传递接力棒”方法(通过传递上下文 从一个视图控制器到下一个)而不是检索它 直接来自应用程序委托。

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

defaultContext = [NSManagedObjectContext MR_defaultContext];

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

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

还要注意,根据这个答案https://stackoverflow.com/a/20536335/1187415MR_contextForCurrentThread 已弃用。

【讨论】:

  • 嗨 Martin...不在我的 iPad 应用程序中使用 Segues 进行导航...使用 UITabBarController。所以我想我的问题是:除了引用 AppDelegate 中定义的上下文之外,你如何将上下文传递给每个类(包括控制器),这可行,但不确定这是不是最好的方法?
  • @spokane-dude:在每个视图控制器中,定义一个 @property (strong, nonatomic) NSManagedObjectContext *context; - 在您的 AppDelegate 中,在 didFinishLaunchingWithOptions 中,您设置视图控制器的上下文属性。 - 比较stackoverflow.com/a/18568793/1187415
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多