2012-08-08 51 views
0

所以我在Cocoa中构建了一个基于文档的应用程序,并试图理解NSManagedObjectContext。我已经阅读过苹果的“核心数据基础”,但无法将其包围。在我的应用程序创建一个自定义CoreDataUtility类,这样我所有的类都可以通过下面的代码行获取上下文:基于文档的可可应用程序的多个上下文?

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

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

所以我的问题是:

  1. 我的假设是每个我创建了一个新的 上下文中创建一个新的窗口,时间是否正确呢?
  2. 如果创建了一个新的环境,他们是不同的(其实我 打印出两个上下文的内存地址和他们 地址是不同的),这是否有东西做的 持久存储区协调员或持久对象存储(这两个概念在我看来也是模糊不清的)?
  3. 如果所有文档都提及相同的上下文,那么我的责任是 每次创建文档时都要创建一个新的上下文?

谢谢大家!

回答

0

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

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

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

如果所有证件是指相同的上下文是我的责任, 创建新的上下文每次创建文档时?

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

你可以提供可可的链接是我的女朋友在哪里你拿了代码?看起来你想要一个单例存储你的上下文,并且通常在基于文档的应用程序中这是一个坏主意,因为将一个函数混淆为一个不同文档的上下文是非常容易的。上下文通过后,您的应用程序应该具有良好的流程。但是,如果我的应用程序不是基于文档的,我总是使用单例。

+0

谢谢弗朗西斯科......对不起,在回复此主题时丢球。 – schmudu 2012-10-03 18:32:38