我刚刚开始学习如何使用核心数据。到目前为止,我learning from的教程非常有用。在它们连接我们想要将数据存储到核心数据的视图控制器的部分中,它们没有解释执行这种“魔术”的方法的过程。
这是方法managedObjectContext
的一个实现,所以我认为如果我在这里发布它可能会有所帮助,你可以向我/我们解释在这里完成的过程是什么:
- (NSManagedObjectContext *) managedObjectContext
{
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
由于某种原因,当我返回上下文对象时,当我返回一个类对象时它不是常规颜色,它只是白色:
非常感谢!
答案 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)
该代码正在做什么
查找app委托对象。这可能在您的项目中称为AppDelegate
。此代码通过向共享UIApplication
实例请求其委托来查找单例。
检查应用委托是否有名为managedObjectContext
的方法。
如果是这样,请调用该方法,然后返回结果。
这是一种糟糕的方式。更好的方法是在视图控制器上声明一个属性:
@property (readwrite, strong) NSManagedObjectContext *managedObjectContext;
然后在创建视图控制器时为其分配值
newViewController.managedObjectContext = self.managedObjectContext;
也就是说,传递托管对象上下文,将其分配给需要使用它的任何对象。不要以为您总是可以从应用代理中查找它,因为如果您更改了应用代理的那一部分,那将会中断。
Xcode使用该颜色,因为它是该方法中的局部变量。无论是对象还是其他类型无关紧要。