将您的 managedObjectContext 设置为初始 viewController OS X 的方法

Ways to get your managedObjectContext to the initial viewController OS X

这就是我目前的做法,但我想知道 Apple 是否建议这样做。我读过一些关于这个的辩论。

let appDelegate : AppDelegate = NSApplication.sharedApplication().delegate as AppDelegate
if let moc = appDelegate.managedObjectContext {
    // do stuff here
}

所以这只是从 AppDelegate 到第一个 viewController。从那里我猜测使用 segues 是绕过 managedObjectContext?

的方法

使用上面的代码非常烦人,因为我将其输入到 viewController 中需要 MOC 的每个方法中。当我有一个带有 return 语句的函数并且我所有使用 MOC 的代码都在 if statement 的 body 内时,这更令人讨厌,因为这会产生错误说明is/may 没有 return。有没有更好的方法来做到这一点,比如让它更全球化?

编辑:

我的 ViewController.swift 文件有这个 header:

import Cocoa
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

并包含一个 Table 视图

我的 AppDelegate.swift 文件有:

import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

Apple 示例代码在应用程序委托中存储和创建核心数据堆栈,但这并不意味着它是正确的。事实上,这是完全错误的。应用程序委托不应拥有数据存储。 Apple 做到了,而且大多数人都效仿,因为它很方便。你真的应该有一个自定义 class 拥有并创建核心数据堆栈。

这个自定义 class 需要在某个地方实例化,它可以在应用程序委托中然后传递给您的根视图控制器,或者它可以在根视图控制器本身中。此自定义 class 也可以是单例(因为您不想要它的多个实例)。

每个视图控制器都应该有一个 public 属性 用于由其创建者设置的 MOC(segue 代码的一部分)。通过这种方式,每个控制器都不会去获取 MOC,而是注入了 MOC 依赖项。这有助于保持关系清晰并有助于单元测试。您也不需要 let 来检查您是否获得了 MOC - 如果它不存在,那就是开发问题(如果无法创建它,您永远不应该创建/推送视图控制器。 ..).