gpt4 book ai didi

cocoa - 如何在基于文档的 Core Data/Cocoa 应用程序中获取当前 NSManagedObjectContext?

转载 作者:行者123 更新时间:2023-12-03 16:59:13 27 4
gpt4 key购买 nike

在应用程序的许多领域工作时,我都会遇到标题问题:模型、 Controller 、getter、setter、操作等。我有一个基于 Core Data 文档的应用程序,并且我不断需要获取当前的引用NSMangedObjectContext 对象。

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

模拟 Controller 是 NSObjectController 的子类,它有一个名为 managementObjectContext 的方法,但是当我调用该方法时,我得到 nil。我不确定为什么返回 nil,但我确实知道 Controller 不代表任何托管对象进行操作。它控制模拟器,这不是 MVC 中的模型。 Controller 是 View 、模型和模拟器之间的接口(interface)。

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

更新:

嗯...感谢 TechZen 让我思想开阔了一点...或者也许只是休息一下,去烧烤...

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

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

然后,消息“managementObjectContext”在我的 Controller 中工作,就像:

[self managedObjectContext];

但是,这仍然不能完全回答我的问题,因为我还想在 NSManagedObject 子类的类方法中获取对托管对象上下文的引用。因此,如果模拟 Controller 然后通过调用 NSManagedObject 子类上的类方法来创建一个新的 NSManagedObject,我希望该方法能够引用上下文并创建该对象。而且我不想将上下文传递给方法...我觉得类方法应该能够获取上下文...我记得看到过这样的代码:

[[NSApp delegate] managedObjectContext];

但这对我不起作用。但如果确实如此,这将是一个很好的解决方案,因为 NSApp 是全局的并返回当前的 NSApplication 实例。

更新:

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

最佳答案

如果您使用的是基于 Core Data 文档的应用程序,则每个文档都将是 NSPersistentDocument 的一个实例,该实例将具有针对该单个文档的自己的 NSManagedObjectContext。

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

NSManagedObjectContext *context=[aPersistentDocument managedObjectContext];

更新:

对于基于文档的应用程序,您没有单一的中央或主托管对象上下文,因为每个文档都有自己的从存储到上下文的完全独立的核心数据堆栈。您最终会得到与打开的文档一样多的上下文。

这与更像数据库的设计形成鲜明对比,在设计中,整个应用程序只有在应用程序编码时定义的存储和上下文。在这种情况下,您可能只有一个在应用程序中随处使用的上下文。在这种情况下,您可以将上下文停放在应用程序委托(delegate)中并从任何地方访问它。

在 NSManagedObject 子类中使用类或实例方法来查找上下文是糟糕的设计,因为这限制了子类使用的灵 active 。为此,该类必须连接到特定应用程序的结构中,以便子类只能在可以找到上下文的特定设计中使用。如果您更改了有关上下文位置或子类使用的任何内容,则必须重新编写。

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

Document-Based Applications OverviewNSPersistentDocument Core Data Tutorial

关于cocoa - 如何在基于文档的 Core Data/Cocoa 应用程序中获取当前 NSManagedObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com