我有一个大脑课程,我想获得Rest服务并将信息放入核心数据。(我已经看过RestKit对象映射,但还没有完全理解它,并希望保持简单)。我想在我的engine
类中获得核心数据知识,但为了覆盖我的基础,我将ManagedObjectContext添加到Tab Bar Controller中的所有VC,就像这样(在app delegate中):< / p>
UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController;
NSArray *viewControllers = [tabBar viewControllers];
NSManagedObjectContext *context = self.managedObjectContext;
self.engine.managedObjectContext = context;
for (id viewController in viewControllers) {
[viewController setManagedObjectContext:context];
}
tabBar.selectedIndex = 2;
return YES;
但是,当我尝试检查我的engine
类中是否有coreData时,我记录了此错误:
if (self.managedObjectContext == NULL || [self.managedObjectContext isEqual:[NSNull null]]) {
NSLog(@"Error");
}
我做错了什么?如何正确地将Core数据传递给非viewController类?
编辑:就在IF语句之前,这在调试器中:
(lldb) po self.managedObjectContext
(NSManagedObjectContext *) $1 = 0x00000000 <nil>
(lldb)
答案 0 :(得分:1)
假设所有其他视图控制器上的'context'属性很强,那么答案是当你去分配它时,它还没有被创建。试试这个:
NSManagedObjectContext *context = self.managedObjectContext;
assert(context); // or NSLog context
self.engine.managedObjectContext = context;
请注意,上下文的所有用户最好都在同一个线程上(我假设代码中有主线程)。
也就是说,一个更好的解决方案是管理向相关方“销售”字典或数组的竞争的类,并将所有上下文访问保存在一个文件(或类)中。这将使未来的调试器变得更容易(恕我直言)&gt;
编辑:如果问题是您在发布的原始代码中设置了值 - 我假设这是您的appDelegate,并且managedObjectContext是一个强属性,然后记录设置操作:
for (id viewController in viewControllers) {
[viewController setManagedObjectContext:context];
NSLog(@"Just set context=%@ in %@", viewController, [viewController managedObjectContext]);
}
现在,在每个viewControllers中,在viewDidLoad中添加以下行:
NSLog(@"ViewController %@ context=%@", self, self.managedObjectContext);
你会发现其中一个是真的:
1)你在三个viewControllers上设置moc就好了,但是在其他地方你设置了一个viewController而没有设置moc(其他一些代码)
2)当你去设置MOC时,viewControllers是nil(逻辑错误)
3)您设置MOC的ViewControllers和记录我建议的消息的ViewControllers是相同的,但是当VC打印日志消息时MOC为nil。在这种情况下,VC中的某些东西正在将MOC重置为nil - 可能在viewDidLoad中。