0

我有一个大脑类,我想获得 Rest 服务并将信息放入核心数据中。(我已经查看了 RestKit 对象映射,但还没有完全理解它并希望让它更简单)。我想在engine课堂上掌握核心数据知识,但为了涵盖我的基础,我将 ManagedObjectContext 添加到选项卡栏控制器中的所有 VC 中,如下所示(在应用程序委托中):

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;

但是,当我尝试检查 coreData 在我的engine班级中是否可用时,我会记录此错误:

        if (self.managedObjectContext == NULL || [self.managedObjectContext isEqual:[NSNull null]]) {
            NSLog(@"Error");
        }

我究竟做错了什么?如何正确地将核心数据传递给非 viewController 类?

编辑:就在 IF 语句之前,在调试器中:

(lldb) po self.managedObjectContext
(NSManagedObjectContext *) $1 = 0x00000000 <nil>
(lldb) 
4

1 回答 1

1

假设所有其他视图控制器上的“上下文”属性都很强大,那么答案是当你去分配它时,它还没有被创建。试试这个:

NSManagedObjectContext *context = self.managedObjectContext;
assert(context); // or NSLog context
self.engine.managedObjectContext = context;

请注意,上下文的所有用户最好都在同一个线程上(我假设我们代码中的主线程)。

也就是说,更好的解决方案是让管理上下文的类将字典或数组“出售”给感兴趣的各方,并将所有上下文访问权保存在一个文件(或类)中。这将使未来的调试器变得更容易(恕我直言)>

编辑:如果问题是在您发布的原始代码中设置了值 - 我假设这是您的 appDelegate,并且 managedObjectContext 是一个强属性,然后记录设置操作:

for (id viewController in viewControllers) {
    [viewController setManagedObjectContext:context];
    NSLog(@"Just set context=%@ in %@", viewController, [viewController managedObjectContext]);
}

现在,在您的每个 viewController 中,在 viewDidLoad 中,添加以下行:

NSLog(@"ViewController %@ context=%@", self, self.managedObjectContext);

您会发现其中之一是正确的:

1)你在三个viewControllers上设置了moc就好了,但是在其他地方你设置了一个viewController并且没有设置moc(其他一些代码)

2) 当你去设置 MOC 时 viewControllers 为 nil (逻辑错误)

3)您设置 MOC 的 ViewController 和记录我建议的消息的 ViewController 相同,但是当 VC 打印日志消息时 MOC 为零。在这种情况下,VC 中的某些东西将 MOC 重置为零 - 可能在 viewDidLoad 中。

于 2012-08-27T13:06:10.890 回答