如何在基于文档的核心数据/Cocoa应用程序中获取当前NSManagedObjectContext?

如何在基于文档的核心数据/Cocoa应用程序中获取当前NSManagedObjectContext?,cocoa,core-data,nsmanagedobjectcontext,Cocoa,Core Data,Nsmanagedobjectcontext,当我在应用程序的许多领域工作时,会出现标题问题:模型、控制器、getter、setter、actions等。我有一个基于核心数据文档的应用程序,我经常需要获取对当前NSMangedObjectContext对象的引用 当前场景涉及我为处理“模拟”而制作的自定义控制器(此应用程序模拟特定类型的数学模型)。有一个名为“模拟”的按钮,它绑定到模拟控制器中的一个操作。仿真控制器需要从当前文档中获取信息,即从当前托管对象上下文中的NSManagedObjects中获取信息 simulation contr

当我在应用程序的许多领域工作时,会出现标题问题:模型、控制器、getter、setter、actions等。我有一个基于核心数据文档的应用程序,我经常需要获取对当前NSMangedObjectContext对象的引用

当前场景涉及我为处理“模拟”而制作的自定义控制器(此应用程序模拟特定类型的数学模型)。有一个名为“模拟”的按钮,它绑定到模拟控制器中的一个操作。仿真控制器需要从当前文档中获取信息,即从当前托管对象上下文中的NSManagedObjects中获取信息


simulation controller是NSObjectController的一个子类,它有一个名为
managedObjectContext
的方法,但当我调用该方法时,得到的结果是零。我不知道为什么会返回nil,但我知道控制器并不代表任何托管对象。它控制的是模拟器,而不是MVC中的模型。控制器是视图、模型和模拟器之间的接口

如何获取存储当前打开窗口的NSManagedObjects的NSManagedObjectContext?当前打开的窗口具有显示上下文中对象信息的视图,模拟按钮位于该窗口的工具栏中

更新: 嗯。。。感谢TechZen为我打开了一点心扉。。。或者只是休息一下,去烧烤

对于这个特定场景,答案是:

将Interface Builder中的托管对象上下文绑定到我的控制器(控制器是在Interface Builder中创建的,然后我将该类更改为NSObjectController的子类)。此设置可以在绑定检查器的参数下找到,称为托管对象上下文。我将其设置为绑定到文件的所有者,并将模型密钥路径设置为“managedObjectContext”

然后,消息“managedObjectContext”在我的控制器中工作,如下所示:

[self managedObjectContext];
然而,这仍然不能完全回答我的问题,因为我还希望在NSManagedObject子类的类方法中获得对托管对象上下文的引用。因此,如果simulation controller然后通过调用我的NSManagedObject子类上的class方法来创建一个新的NSManagedObject,我希望该方法引用上下文并创建对象。我不想把上下文传递给方法。。。我觉得类方法应该能够获得上下文。。。我记得看到过这样的代码:

[[NSApp delegate] managedObjectContext];
但这对我不起作用。但如果是这样,这将是一个极好的解决方案,因为Cauxe NSApp是全局的,并返回当前的NSApplication实例

更新:
好吧,经过大量的阅读和谷歌搜索。。。我发现我在设计我的应用程序时完全偏离了目标。我没有让模拟控制器接收模拟按钮的点击,而是为该窗口创建了一个自定义NSWindowController,它接收模拟按钮点击事件(一种iAction)。NSWindowController引用了NSPersistantDocument,该文档引用了NSManagedObjectContext。我编写的这个自定义窗口控制器是NSManagedObjectContext,并将其传递给模拟控制器。。。世界充满了欢乐。不确定这对其他人有多有用,因为这个问题和答案现在充斥着噪音。

如果您使用的是基于核心数据文档的应用程序,那么每个文档都将是NSPersistentDocument的一个实例,对于单个文档,它将有自己的NSManagedObjectContext

您可以通过以下方式获取上下文:

NSManagedObjectContext *context=[aPersistentDocument managedObjectContext];
更新: 对于基于文档的应用程序,您没有单一的、集中的或主管理的对象上下文,因为每个文档从存储到上下文都有自己完全独立的核心数据堆栈。您最终会得到与打开的文档一样多的上下文

这与更像数据库的设计形成了对比,在这种设计中,整个应用程序只有那些在编写应用程序时定义的存储和上下文。在这种情况下,您可能只有一个应用程序中到处都使用的上下文。在这种情况下,您可以将上下文停在应用程序代理中,并从任何位置访问它

在NSManagedObject子类中使用一个类或实例方法来查找上下文是不好的设计,因为这限制了子类使用的灵活性。要做到这一点,类必须连接到特定应用程序的结构中,这样子类只能在特定设计中使用,因为它可以找到上下文。如果更改了上下文的位置或子类的使用,则必须重新编写

我认为你需要退出并重新考虑你的设计,决定你是想要一个基于文档的应用程序还是一个更像数据库的应用程序。我建议阅读:


如何获取与活动窗口关联的NSPersistentDocument对象?所以我提到的控制器是由nib文件加载器(我想)为我实例化的,据我所知,它没有对NSPersistentDocument的引用。通常,通过window controller的document属性。我似乎很清楚,我对Mac应用程序开发的理解很弱,这就是为什么我在这个问题上遇到这么多麻烦。。。我的应用程序架构可能违反了苹果公司的所有准则。因此,获取与当前窗口关联的managedObjectContext的最佳方法似乎是让控件向其所在窗口的NSWindowController发送消息,而窗口控制器将使用类似:[[self document]managedObjectContext]的代码获取上下文,并将上下文传递给所需的任何消息。听起来对吗?是的,听起来对。重要的是要理解体系结构从数据m开始