说我有一个视图控制器(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?
感谢
答案 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 Datalet managedObjectContext = CoreDataManager.sharedManager.managedObjectContext
或调用保存操作
CoreDataManager.sharedManager.saveAction(self)