Macos 定义NSManagedObjectContext的正确方法?

Macos 定义NSManagedObjectContext的正确方法?,macos,swift,core-data,Macos,Swift,Core Data,在我早期使用CoreData的应用程序中,我使用以下方式定义我的NSManagedObjectContext: class MyViewController: NSViewController { lazy var moc: NSManagedObjectContext? = { let app = NSApplication.sharedApplication().delegate as! AppDelegate if let moc = app.ma

在我早期使用
CoreData
的应用程序中,我使用以下方式定义我的
NSManagedObjectContext

class MyViewController: NSViewController {

    lazy var moc: NSManagedObjectContext? = {
        let app = NSApplication.sharedApplication().delegate as! AppDelegate
        if let moc = app.managedObjectContext {
            return moc
        } else {
            return nil
        }
    }()

    // ....
}
但后来我下载了苹果的示例应用程序,名为
Eartquakes
,那里的
NSManagedObjectContext
是这样的:

import Cocoa

class CoreDataStackManager {

    class var sharedManager: CoreDataStackManager {
        struct Singleton {
            static let coreDataStackManager = CoreDataStackManager()
        }
        return Singleton.coreDataStackManager
    }

    // persistenStoreCoordinator etc...
在ViewController中:

class ApplesViewController: NSViewController {

    private lazy var managedObjectContext: NSManagedObjectContext = {
        let moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)

        moc.persistentStoreCoordinator = CoreDataStackManager.sharedManager.persistentStoreCoordinator

        return moc
    }()
}

所以我只是想知道哪种方式是正确的——我假设这是苹果的方式:)——这就是为什么核心数据堆栈在默认情况下是在AppDelegate中定义的?

有很多方法可以做到这一点,但最终涉及到可维护性

我发现的与苹果传统的其他产品搭配的最好方式是:

  • 为核心数据创建单独的控制器
  • 在AppDelegate中初始化该控制器
  • 使用依赖项注入将该控制器传递到视图控制器

  • 不要使用单件。虽然在一个项目开始时感觉很容易,但它往往会把你拖到一个角落里

    我认为使用尽可能小的AppDelegate和特定的管理器会更干净。谢谢你的回答,依赖注入对我来说是个新词,现在就用谷歌搜索:)它只是意味着存在的对象传递了对刚刚创建的对象的引用。AppDelegate将引用传递给RootViewController,RootViewController传递给下一个视图控制器,等等。这不是一个非常复杂的概念。