将核心数据传递给非View Controller类

时间:2012-08-26 21:51:37

标签: iphone core-data nsmanagedobjectcontext

我有一个大脑课程,我想获得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) 

1 个答案:

答案 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中。