【发布时间】:2016-01-30 13:41:40
【问题描述】:
假设我有一个视图控制器 (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?
谢谢
【问题讨论】:
-
您可以传递应用程序委托实例来访问整个核心数据堆栈,而不是传递托管对象上下文,但是 - 因为您使用的是检索对应用程序的引用的方式无论如何在 VCA 中委托——什么都不传递,在 VCB 中做同样的事情。还可以考虑使用共享单例类来管理 Core Data 的东西。
-
我读到在不同的视图控制器中不断向应用程序委托请求托管对象上下文是“示意图不好”,您应该从顶部传递它的引用,即“告诉不要问”方法...
-
是的,但是您已经违反了 VCA 中的规则;-)
-
当然 - 但 VCA 可能是我的根控制器或从应用程序委托
application(application: UIApplication, didFinishLaunchingWithOptions传递上下文...那么这样可以吗? -
是的,那是个好地方。