如何将managedObjectContext获取到初始viewController OS X.

时间:2015-05-01 02:48:27

标签: macos swift core-data dependency-injection nsmanagedobjectcontext

这就是我目前正在做的事情,但我想知道这是否是Apple的建议。我已经阅读了一些有关此事的辩论。

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

这样只是为了从AppDelegate到第一个viewController。从那里我猜测使用segues是绕过managedObjectContext的方式吗?

使用上面的代码非常烦人,因为我在需要viewController的{​​{1}}中的每个方法中键入了这些代码。当我有一个带有MOC语句的函数时,使用return的所有代码都在MOC的正文中,因为这会产生错误,说明这一点,这更令人讨厌有/可能不是if statement。有没有更好的方法来做到这一点,比如让它更全球化?

修改

我的ViewController.swift文件有这个标题:

return

并包含表格视图

我的AppDelegate.swift文件有:

import Cocoa
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

1 个答案:

答案 0 :(得分:2)

Apple示例代码在应用代理中存储并创建Core Data堆栈,但这并不意味着它是对的。事实上,这是完全错误的。应用代表不应拥有数据存储。苹果做到了,大多数人都跟随,因为它很方便。您应该拥有一个拥有并创建Core Data堆栈的自定义类。

这个自定义类需要在某个地方实例化,可以在app委托中,然后传递给根视图控制器,也可以在根视图控制器本身。这个自定义类也可以是一个单例(因为你不想要它的多个实例)。

每个视图控制器都应具有MOC的公共属性,该属性由其创建者(segue代码的一部分)设置。通过这种方式,每个控制器都没有进入并获得MOC,正在注入MOC依赖。这有助于保持关系清洁并有助于单元测试。你也不需要let检查你是否得到了MOC回来 - 如果它不存在它是一个发展问题(如果它不能被创建你应该从来没有创建/推动视图控制器......)。