假设我有一个视图控制器(VCA),它与另一个视图控制器(VCB)分离。在准备segue时,VCA传递其managedObjectContext(即遵循“告诉不要问”的约定)。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?
谢谢

最佳答案

另一种选择是单子类。
创建一个新的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 ...

}

然后用AppDelegate中的整个核心数据堆栈替换lazy var ...
现在您可以使用
let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext

或调用保存操作
CoreDataManager.sharedManager.saveAction(self)

09-29 21:04