在Document的ArrayController中访问appdelegate的managedObjectContext

时间:2014-07-17 18:29:47

标签: objective-c cocoa core-data swift nsmanagedobjectcontext

我只是在学习一些核心数据,并且遇到了一个问题,即拥有并能够访问单独的商店以获取应用程序范围和仅文档数据。

我有一个基于文档的应用程序,它当前使用managedObjectContext中的一些实体通过NSArrayController填充表。

但是,其中一些实体应该是应用程序范围的(所有文档的部分经验 - 例如,代表常用工具的按钮数据)

因此,我在AppDelegate代码中粘贴了非基于文档的应用程序,该应用程序为应用程序创建了一个单独的应用程序范围的存储和managedObjectContext。我想要做的是通过数组控制器(如前所述)在每个NSPersistentDocument(readonly)中访问此MOC,以填充每个打开的文档的表视图。

如何做到最好?如果这不是从应用程序范围的MOC填充每个文档中出现的TableView的方法,我应该选择哪种方式?

P.S我在Swift工作,但熟悉Objective-C - 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

根据Apple的说法,您应该将您的MOC传递给控制器​​。来自Core Data Snippets。请注意最后两段。

  

按照惯例,您从视图控制器获取上下文。但是,您必须适当地实现您的应用程序,以遵循此模式。   实现与Core Data集成的视图控制器时,可以添加NSManagedObjectContext属性。

     

创建视图控制器时,将它传递给应该使用的上下文。您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文。应用程序委托通常负责创建一个上下文以传递给显示的第一个视图控制器。

     

视图控制器通常不应从全局对象(例如应用程序委托)检索上下文 - 这会使应用程序体系结构变得僵硬。视图控制器也不应为自己的用途创建上下文(除非它是嵌套的上下文)。这可能意味着使用控制器上下文执行的操作未在其他上下文中注册,因此不同的视图控制器将对数据有不同的视角。

     

但是,有时候,从应用程序或文档或视图控制器以外的其他位置检索上下文会更容易或更合适。您可能在基于Core Data的应用程序中使用的几个对象保留对托管对象上下文的引用。托管对象本身具有对其自身上下文的引用,支持Core Data的各种控制器对象(如数组和对象控制器)(OS X中的NSArrayController和NSObjectController以及iOS中的NSFetchedResultsController)也是如此。

     

从其中一个对象中检索上下文的优点是,如果重新构建应用程序,例如使用多个上下文,则代码可能仍然有效。例如,如果您有一个托管对象,并且想要创建与其相关的新托管对象,则可以向原始对象询问其托管对象上下文并使用该对象创建新对象。这将确保您创建的新对象与原始对象位于相同的上下文中。