在macOS中初始化CoreData

时间:2018-04-16 18:29:20

标签: macos core-data

在Cocoa中,Storyboard的第一个视图控制器会在调用viewDidLoad AppDelegate之前调用applicationDidFinishLaunching(在第一个视图控制器上)。
由于我抓取NSManagedObjectContext中的applicationDidFinishLaunching,我需要在加载数据之前等待applicationDidFinishLaunching

换句话说,在viewDidLoad中,我还没有NSManagedObjectContext

我现在在做什么:

我在applicationDidFinishLaunching添加viewDidLoad观察者,并在触发数据时加载数据。

所以(按顺序):
1. ViewController正在添加applicationDidFinishLaunching观察者 2. AppDelegates运行其applicationDidFinishLaunching并触发观察者 3.我可以从ViewController加载数据。

我意识到我viewDidLoad之前<{>> 要在applicationDidFinishLaunching之前调用。如果更改了该顺序,则会在applicationDidFinishLaunching之后添加观察者,并且不会加载数据。

它会更安全吗?让我的CoreDataManager&#39;从AppDelegate直接在其NSManagedObjectContext

中获取init

2 个答案:

答案 0 :(得分:1)

我建议修改一下设计,从AppDelegate类中删除任何核心数据的使用,然后将任何初始化移动到根视图控制器中,然后使用依赖注入将托管对象上下文传递给其他视图控制器(或者具有单独的核心数据管理器类实现为单例)。这将使您摆脱这样的问题。

答案 1 :(得分:0)

Joakim Danielson在这里提供的答案就是我最终做的事情(信用到期的信用)。

<强> - 修改

完全按照Joakim Danielson的建议行事。获取上下文的给定代码默认情况下可能在AppDelegate,但它完全独立。它可以在任何地方移动。
我基本上将以下函数移到我的CoreDataManager课程中,并且我在init()中调用它:

lazy var persistentContainer: NSPersistentContainer = {

    let container = NSPersistentContainer(name: "AppName")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error {
            // Replace this implementation with code to handle the error appropriately.
            fatalError("Unresolved error \(error)")
        }
    })
    return container
}()

另外,不要忘记saveContext()中的AppDelegate需要更新(默认情况下,它指向自己的getter)。

(上一个回答:)

我已经(稍微)将lazy var persistentContainer: NSPersistentContainer中提供的签名AppDelegate(通过在创建项目时检查CoreData)更改为:static var persistentContainer: NSPersistentContainer

static var coreDataContext: NSManagedObjectContext = {

    let container = NSPersistentContainer(name: "AppName")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error {
            // Replace this implementation with code to handle the error appropriately.
            fatalError("Unresolved error \(error)")
        }
    })
    return container.viewContext
}()

我的CoreDataManager(单身),现在可以使用此init:

class CoreDataManager {

static let shared = CoreDataManager()

weak var context: NSManagedObjectContext!

init() {
    self.context = AppDelegate.coreDataContext
}

使用此模式(在AppDelegate中):

static var coreDataContext: NSManagedObjectContext = {...}()

确保该块只执行一次。

现在,在任何阶段使用NSManagedObjectContext都是安全的。