基于文档的Cocoa应用程序的多个上下文?

时间:2012-08-08 02:01:29

标签: objective-c cocoa nsmanagedobjectcontext

所以我在Cocoa中构建一个基于文档的应用程序,并尝试理解NSManagedObjectContext。我已经阅读了Apple的“核心数据基础知识”,但无法理解它。在我的应用程序中,我创建了一个自定义的CoreDataUtility类,以便我的所有类都可以通过以下代码行获取上下文:

MyCoreDataUtility *coreData = [MyCoreDataUtility sharedCoreDataUtility];
NSManagedObjectContext *context = [coreData context];

我从网站“可可是我的女朋友”中得到了这个想法。我感到困惑的是,当我运行我的应用程序并创建一个新窗口(我的文件所有者类是NSPersistentDocument的子类)时,如果我在新窗口上更改上下文,则视图将反映旧窗口上的更改以及新的。基于此,我假设两个窗口都以某种方式引用相同的上下文或至少相同的数据。

所以我的问题是:

  1. 我假设每次创建一个新窗口 上下文被创建,这是正确的吗?
  2. 如果创建了新的上下文并且它们不同(我实际上是 打印出两个上下文的内存地址和它们 地址不同)这是否与此有关 持久性存储协调器或持久对象存储(两者都有 这些概念在我看来也很模糊)?
  3. 如果所有文件都涉及相同的背景,我有责任 每次创建文档时都创建一个新的上下文?
  4. 全部谢谢!

1 个答案:

答案 0 :(得分:0)

  

我假设每次我创建一个新窗口   创建了上下文,这是正确的吗?

不,是的。创建一个新窗口不会创建新的上下文,但我认为您所看到的“新窗口”实际上是您“创建新文档”的操作。在具有CoreDate的基于文档的应用程序中,您可能拥有一个持久存储,它可以为每个文档创建一个新的上下文。

这也是你第二个问题的答案。商店协调员只是管理应用程序所有文档的中心点。它负责一些与菜单相关的操作,例如打开,保存和所有副作用。

  

如果所有文件都涉及相同的背景,我有责任   每次创建文档时都创建一个新的上下文?

这是不可能的。一个上下文可以仅与一个文件(或“商店”)相关,因此每个文档必须具有“至少”一个上下文。如果您将模板用于基于CoreData和多文档的应用程序,则无需担心创建新上下文。正如我之前所说,商店协调员将负责处理。但是,当您了解有关CoreData的更多信息时,特别是如果您进行多线程处理,则必须创建多个上下文,因为上下文无法跨线程。

你可以提供Cocoa的链接是我的女朋友,你拿了那个代码吗?看起来你想要一个单例来存储你的上下文,而且在基于文档的应用程序中通常这是一个坏主意,因为它很容易弄乱一些函数,使一个函数成为不同文档的上下文。您的应用程序应该具有传递上下文的良好流程。但是,如果我的应用程序不是基于文档的,我总是使用单例。