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

时间:2017-01-14 17:16:41

标签: swift core-data singleton nsmanagedobjectcontext

在我的应用程序中,我将Core Data堆栈从AppDelegate中移出并移动到自己的名为LiftEventDataManager的类中。有几个类我可以在其中获得对此堆栈的引用,当然,每次创建新的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正在获取对核心数据堆栈的引用。我想我可以使用:

获取对象的managedObjectContext
let moc = newLiftEvent.managedObjectContext

然后将其传递给saveLiftEvent(moc: NSManagedObjectContext)

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

1 个答案:

答案 0 :(得分:0)

您需要通过某种方式传递NSManagedObjectContext。单身是一种方法,但它肯定不是唯一的方法。

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

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