" managedObjectContext"方法工作?

时间:2014-04-15 23:47:21

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我刚刚开始学习如何使用核心数据。到目前为止,我learning from的教程非常有用。在它们连接我们想要将数据存储到核心数据的视图控制器的部分中,它们没有解释执行这种“魔术”的方法的过程。

这是方法managedObjectContext的一个实现,所以我认为如果我在这里发布它可能会有所帮助,你可以向我/我们解释在这里完成的过程是什么:

- (NSManagedObjectContext *) managedObjectContext
{
    NSManagedObjectContext *context = nil;

    id delegate = [[UIApplication sharedApplication] delegate];

    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }

    return context;
}

由于某种原因,当我返回上下文对象时,当我返回一个类对象时它不是常规颜色,它只是白色:

enter image description here

非常感谢!

2 个答案:

答案 0 :(得分:0)

id delegate = [[UIApplication sharedApplication] delegate];

在这里,我们获取对应用程序委托的引用。这是XCode为您生成的类的实例(应该具有名称[Prefix of your project]AppDelegate)。

[UIApplication sharedApplication]返回一个单例对象。 Singleton是一种设计模式,基本上可以概括为“如果你调用这个方法,它将总是返回同一个对象。”所以这意味着每当我们在程序中调用它时,我们总是得到相同的应用程序委托。

 if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }

我实际上有点不知道为什么教程要求您在此处拨打performSelector:respondsToSelector:似乎更合适,performSelector:会引发异常,如果您的delegate对象无论如何都不属于正确的类,因此用if语句保护实际消息毫无意义。

如果你忽略了我认为不必要的样板文件,你所做的就是在app delegate singleton上调用一个方法。您可以在项目中查找它并查看它的作用 - 根据上下文判断,它返回NSManagedObjectContext类。

return context;

请注意,这是而不是实际返回一个类对象,而是一个NSManagedObjectContext的实例。因此,可以预期颜色为白色。

答案 1 :(得分:0)

该代码正在做什么

  1. 查找app委托对象。这可能在您的项目中称为AppDelegate。此代码通过向共享UIApplication实例请求其委托来查找单例。

  2. 检查应用委托是否有名为managedObjectContext的方法。

  3. 如果是这样,请调用该方法,然后返回结果。

  4. 这是一种糟糕的方式。更好的方法是在视图控制器上声明一个属性:

    @property (readwrite, strong) NSManagedObjectContext *managedObjectContext;
    

    然后在创建视图控制器时为其分配值

    newViewController.managedObjectContext = self.managedObjectContext;
    

    也就是说,传递托管对象上下文,将其分配给需要使用它的任何对象。不要以为您总是可以从应用代理中查找它,因为如果您更改了应用代理的那一部分,那将会中断。

    Xcode使用该颜色,因为它是该方法中的局部变量。无论是对象还是其他类型无关紧要。