保存segue在Swift中传递了managedObjectContext

时间:2016-01-30 13:41:40

标签: swift core-data

说我有一个视图控制器(VCA),它与另一个视图控制器(VCB)相互隔离。在准备segue时,VCA传递其managedObjectContext(即遵循“tell do not ask”约定)。 VCA还有一个函数saveManagedObjectContext(),用于执行保存和错误处理。

所以,在VCA中:

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

...

func saveManagedObjectContext() {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch let error as NSError {
            print("Could not save \(error), \(error.userInfo)")
            abort()
        }
    }
}

...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    ...

    if let vcb = segue.destinationViewController as? VCB {
        vcb.managedObjectContext = managedObjectContext
    }

    ...

}

并在VCB中:

var managedObjectContext: NSManagedObjectContext? = nil

说VCB将一些实体添加到从VCA传递给它的managedObjectContext

func createSomeEntity() {
    let entity = NSEntityDescription.entityForName("SomeEntity", inManagedObjectContext: managedObjectContext!)
    something = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedObjectContext) as? SomeEntity
}

是否有任何(正确的)方法从VCA调用saveManagedObjectContext()函数而不必将函数复制到VCB?

感谢

2 个答案:

答案 0 :(得分:1)

关于“告诉别问”的好处。很多Apple示例代码都传播了这个概念。 然而,近年来,Apple还提供了一个示例代码,其中包含一个处理对象图的Core Data堆栈类,实际上放弃了“tell do not ask”模式

此外,在许多受欢迎且备受赞誉的开源项目中,使用了这种模式。在大多数情况下,您可以减少代码并仍然具有强大的解决方案。例如,在具有嵌套背景上下文的更复杂项目中,它通常是唯一可行的设置。

因此,我建议创建一个处理核心数据堆栈的CoreDataManager类,或者使用app委托创建不太复杂的应用程序(单个主线程上下文)。

请注意,在Swift中,你可以用全局变量(你应该谨慎使用它)来使这个非常简洁!例如,在你可以写的AppDelegate.swift之上

let SharedAppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)

(我喜欢利用我的全球单身人士)。您可以按如下方式使用

do { try SharedAppDelegate.context.save() } catch {}

答案 1 :(得分:1)

另一种选择是单身人士。

创建一个新的Swift文件,用

替换预定义的代码
class CoreDataManager: NSObject {

  // MARK: - Shared Instance

  class var sharedManager : CoreDataManager {
    struct Singleton {
      static let instance = CoreDataManager()
    }
    return Singleton.instance
  }

  // MARK: - Core Data stack

  lazy var ...

}

然后将lazy var ...替换为AppDelegate中的整个Core Data堆栈。

现在,您可以使用

从任何地方访问Core Data
let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext 

或调用保存操作

CoreDataManager.sharedManager.saveAction(self)