这就是我目前正在做的事情,但我想知道这是否是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 {
答案 0 :(得分:2)
Apple示例代码在应用代理中存储并创建Core Data堆栈,但这并不意味着它是对的。事实上,这是完全错误的。应用代表不应拥有数据存储。苹果做到了,大多数人都跟随,因为它很方便。您应该拥有一个拥有并创建Core Data堆栈的自定义类。
这个自定义类需要在某个地方实例化,可以在app委托中,然后传递给根视图控制器,也可以在根视图控制器本身。这个自定义类也可以是一个单例(因为你不想要它的多个实例)。
每个视图控制器都应具有MOC的公共属性,该属性由其创建者(segue代码的一部分)设置。通过这种方式,每个控制器都没有进入并获得MOC,正在注入MOC依赖。这有助于保持关系清洁并有助于单元测试。你也不需要let
检查你是否得到了MOC回来 - 如果它不存在它是一个发展问题(如果它不能被创建你应该从来没有创建/推动视图控制器......)。