Document的ArrayController中访问appdelegate的managedObjectContext

Posted

技术标签:

【中文标题】Document的ArrayController中访问appdelegate的managedObjectContext【英文标题】:access appdelegate's managedObjectContext in ArrayController of Document 【发布时间】:2014-07-17 18:29:46 【问题描述】:

我刚刚学习了一些核心数据,并且遇到了一个问题,即拥有并能够访问应用程序范围数据和纯文档数据的单独存储。

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

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

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

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

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

【问题讨论】:

你的方法对我来说听起来不错。 谢谢 - 你将如何让应用程序 MOC 与文档 NSArrayController 一起工作 - 它应该像单例吗? 【参考方案1】:

根据 Apple 的说法,您应该将 MOC 传递给控制器​​。来自核心数据片段。注意最后两段。

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

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

视图控制器通常不应该从全局对象(例如应用程序委托)中检索上下文——这使得应用程序架构变得僵化。视图控制器也不应该为自己的使用创建上下文(除非它是嵌套上下文)。这可能意味着使用控制器的上下文执行的操作没有注册到其他上下文,因此不同的视图控制器对数据有不同的看法。

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

从这些对象之一中检索上下文的好处是,如果您重新构建应用程序,例如使用多个上下文,您的代码可能会保持有效。例如,如果您有一个托管对象,并且您想创建一个与之相关的新托管对象,您可以向原始对象询问其托管对象上下文并使用它创建新对象。这将确保您创建的新对象与原始对象处于相同的上下文中。

【讨论】:

这最终奏效了。如何实际做到这一点并非易事。我创建了一个单例,然后我可以将其作为自定义对象添加到 xib 文件中,并使用数组控制器创建绑定等。

以上是关于Document的ArrayController中访问appdelegate的managedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

ember 中模型中每个项目的 ArrayController 的属性

当“内容数组”-Binding 获取内容时,如何从 ArrayController 中删除对象?

NSArray ArrayController SelectedObjects 无

Ember.js - ArrayController 和 CollectionView 之间的区别

如何使用 Ember ArrayController 获取对象集合?

在代码中使用核心数据 - Objective-C/Cocoa