Swift 在AppDelegate中设置managedObjectContext

Swift 在AppDelegate中设置managedObjectContext,swift,core-data,Swift,Core Data,我正在尝试学习核心数据的基础知识,并启动了一个单视图应用程序,同时拥有一个基本的主细节应用程序模板,其中核心数据可供参考 我无法通过AppDelegate.swift在MasterViewController中设置managedObjectContext 到目前为止,我已经知道了,主细节模板使用了一个我没有使用的分割视图,那么我怎样才能只用一个视图应用程序来做类似的事情呢 func application(application: UIApplication, didFinishLaunchin

我正在尝试学习核心数据的基础知识,并启动了一个单视图应用程序,同时拥有一个基本的主细节应用程序模板,其中核心数据可供参考

我无法通过AppDelegate.swift在MasterViewController中设置managedObjectContext

到目前为止,我已经知道了,主细节模板使用了一个我没有使用的分割视图,那么我怎样才能只用一个视图应用程序来做类似的事情呢

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // How to reference MasterViewController???

    controller.managedObjectContext = self.managedObjectContext
    return true
}

您可以使用以下代码行访问整个应用程序中的托管对象上下文

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
因此,您可以删除以下行

controller.managedObjectContext = self.managedObjectContext

我建议
NSManagedObjectContext
传递给苹果文档中建议的相应视图控制器。 这包括以下步骤:

  • 准备你的核心数据栈
  • 保留对核心数据堆栈中准备的
    NSManagedObjectContext
    的强引用
  • 在(swift)视图控制器文件中包括
    NSManagedObjectContext
    公共属性
  • 从堆栈中的引用设置视图控制器中的公共属性

获取托管对象上下文

在iOS中:

按照惯例,您可以从视图控制器获取上下文。你必须 不过,要遵循这一点,请适当地实现您的应用程序 模式

实现与核心数据集成的视图控制器时, 您可以添加NSManagedObjectContext属性

创建视图控制器时,将传递它应该传递的上下文 使用。传递现有上下文,或(在需要的情况下) 新控制器用于管理一组离散的编辑)新上下文 你为它创造的。这通常是公司的责任 应用程序委托创建要传递到第一个视图的上下文 显示的控制器

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

不过,有时检索数据更容易或更合适 应用程序、文档或 视图控制器。在基于数据的核心应用程序中可能使用的几个对象 应用程序保留对托管对象上下文的引用。管理的 对象本身具有对其自身上下文的引用,各种 支持核心数据(如数组和对象)的控制器对象 控制器(OS X中的NSArrayController和NSObjectController,以及 iOS中的NSFetchedResultsController)

从这些对象之一检索上下文具有优势 如果你重新设计你的应用程序,例如利用 在多个上下文中,您的代码可能保持有效。例如 如果您有一个托管对象,并且希望创建一个新的托管对象 对象,您可以向原始对象请求其 托管对象上下文,并使用该上下文创建新对象。这将 确保您创建的新对象与 原创的


好的,很酷,所以我在AppDelegate.swift中的application()函数中只有这一行,那么我如何在,比如我的MasterViewController中访问它呢?为了方便起见,您可以在AppDelegate静态变量mObjectContext中添加一个静态属性:NSManagedObjectContext{return(UIApplication.sharedApplication().delegate as!AppDelegate).managedObjectContext}