假设我有一个视图控制器(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)