【问题标题】:Multiple Contexts for Document-based Cocoa Application?基于文档的 Cocoa 应用程序的多个上下文?
【发布时间】:2012-08-08 02:01:28
【问题描述】:

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

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

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

所以我的问题是:

  1. 我假设每次创建新窗口时都会创建一个新窗口 上下文已创建,这是正确的吗?
  2. 如果创建了一个新的上下文并且它们是不同的(实际上我 打印出两个上下文的内存地址,它们 地址不同)这是否与 持久存储协调器或持久对象存储(两者 这些概念在我脑海中也很模糊)?
  3. 如果所有文档都引用相同的上下文,我有责任 每次创建文档时都要创建一个新的上下文?

谢谢大家!

【问题讨论】:

    标签: objective-c cocoa nsmanagedobjectcontext


    【解决方案1】:

    我假设每次创建新窗口时都会创建一个新窗口 上下文已创建,是否正确?

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

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

    如果所有文档都引用相同的上下文,我有责任 每次创建文档时都创建一个新上下文?

    这是不可能的。一个上下文只能与一个文件(或“存储”)相关,因此每个文档都必须“至少”具有一个上下文。如果您将模板用于基于 CoreData 和多文档的应用程序,则不必担心创建新上下文。正如我之前所说,商店协调员会处理这个问题。但是,随着您对 CoreData 的了解越来越多,尤其是在进行多线程处理时,您将不得不创建多个上下文,因为上下文不能跨线程。

    您能否提供来自可可是我的女朋友的链接,您在哪里获取了该代码?似乎你想要一个单例来存储你的上下文,这在基于文档的应用程序中通常是一个坏主意,因为它很容易把事情搞砸,给一个函数提供不同文档的上下文。您的应用程序在传递上下文的地方应该有一个良好的流程。但是,如果我的应用程序不是基于文档的,我总是使用单例。

    【讨论】:

    • 感谢弗朗西斯科...抱歉在回复这个帖子时失态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多