【问题标题】:Ways to get your managedObjectContext to the initial viewController OS X将 managedObjectContext 获取到初始 viewController OS X 的方法
【发布时间】:2015-05-01 02:48:26
【问题描述】:

这就是我目前的做法,但我想知道这是否是 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 的主体内时,这更加烦人,因为这会产生错误,指出存在/可能不是return .有没有更好的方法来做到这一点,比如让它更全球化?

编辑:

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

import Cocoa
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

并包含一个表格视图

我的 AppDelegate.swift 文件有:

import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是很好的信息。谢谢你。所以我看到人们制作的所有这些自定义类,我可以添加到我的项目中,这些都是正确的想法吗?所以我可以只使用其中一个吗?此外,您说 MOC 可以在应用程序委托中实例化,然后传递给根视图控制器。没有转场,我该怎么做?
    • 应用委托有一个属性持有窗口,而窗口有一个根视图控制器的属性...
    • 我理解你所说的意思,但我无法编写代码。如果您有时间帮助我编写代码,将不胜感激。我正在尝试使用 Swift 来做到这一点,这确实使查找示例变得困难。
    • 我不知道你的根视图控制器是什么,或者它有什么属性。试一试,创建一个新问题,显示你有什么,如果它不起作用。
    • 我在问题中添加了一些代码。不确定它是否有帮助,但除了显示所有核心数据之外,没什么用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多