如何在不使用单例的情况下保存正确的 NSManagedObjectContext?

How do I save the correct NSManagedObjectContext without using a singleton?

在我的应用程序中,我将 Core Data 堆栈从 AppDelegate 中移出并移到它自己的 class 中,称为 LiftEventDataManager。有几个 classes,我在其中获得了对这个堆栈的引用,当然,每次我这样做都会创建一个新的 NSManagedObjectContext。这些引用用于执行诸如从数据库中提取一些默认应用程序数据以显示在视图中的操作(例如,用户选择的列表)。

当初始 viewController 出现时,我的 viewModel 向我的 LiftEventDataManager 请求一个新对象来支持视图。用户的输入用于设置该对象的属性,完成后,我想保存该对象。但是,该对象未被保存。

当用户点击保存时,viewModel 使用其对 LiftEventDataManager 的引用并调用此函数 (Swift 2.3):

func saveLiftEvent() {
  do {
    try moc!.save()
        } catch {
            let saveError = error as NSError
            print("\(saveError), \(saveError.userInfo)")
        }
  NSNotificationCenter.defaultCenter().postNotificationName("LiftEventDidSave", object: nil)
}

我相信该对象没有被保存,因为它是由我的 viewModel 创建的,向 LiftEventDataManager 询问一个新对象,该对象将具有 managedObjectContext,但调用了保存我认为 LiftEventDataManager 正在获取对核心数据堆栈的 new 引用。我想我可以通过以下方式获得对象的 managedObjectContext

let moc = newLiftEvent.managedObjectContext

然后传给saveLiftEvent(moc: NSManagedObjectContext).

我是否已经回答了我自己关于如何正确保存它的问题,或者我的设计是否存在缺陷?请记住,我不想使用单例。

您需要有某种方式来传递 NSManagedObjectContext。单例是一种方法,但它肯定不是唯一的方法。

听起来您每次需要时都在创建 LiftEventDataManager 的新实例。您可以使用某种依赖注入来传递现有实例,而不是创建新实例吗?

如果视图模型有对数据管理器的引用,那可能是集中事物而不用创建单例的好地方。