【问题标题】:How does the "managedObjectContext" method work?“managedObjectContext”方法是如何工作的?
【发布时间】:2014-04-15 23:47:21
【问题描述】:

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

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

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

    id delegate = [[UIApplication sharedApplication] delegate];

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

    return context;
}

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

非常感谢!

【问题讨论】:

    标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:
    id delegate = [[UIApplication sharedApplication] delegate];
    

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

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

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

    我实际上有点不明白为什么教程要你在这里调用 performSelector:respondsToSelector: 似乎更合适,如果你的 delegate 对象不是,performSelector: 会引发异常t 无论如何都是正确的类,所以用 if 语句保护实际消息是没有意义的。

    如果您忽略在我看来是不必要的样板文件,那么您所做的就是在应用程序委托单例上调用一个方法。您可以在您的项目中查找它并查看它的作用——根据上下文判断,它返回一个NSManagedObjectContext 类。

    return context;
    

    请注意,这不是实际上返回了一个类对象,而是一个NSManagedObjectContext 的实例。因此,白色是意料之中的。

    【讨论】:

      【解决方案2】:

      这段代码在做什么

      1. 查找应用程序委托对象。这可能在您的项目中被称为AppDelegate。此代码通过向共享的 UIApplication 实例询问其委托来找到单例。

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

      3. 如果是,则调用该方法,并返回结果。

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

      @property (readwrite, strong) NSManagedObjectContext *managedObjectContext;
      

      然后在创建视图控制器的时候给它赋值

      newViewController.managedObjectContext = self.managedObjectContext;
      

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 2019-05-20
        • 2012-04-21
        • 2016-07-26
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多