假设我有一个视图控制器(VCA),它与另一个视图控制器(VCB)连接。在准备转换时,VCA传递它的managedObjectContext (即遵循"tell不要询问“的约定)。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?
谢谢
发布于 2016-01-30 15:15:45
另一种选择是单例类。
创建一个新的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的整个核心数据堆栈。
现在,您可以从任何地方访问核心数据
let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext 或者调用保存操作。
CoreDataManager.sharedManager.saveAction(self)发布于 2016-01-30 14:38:01
“告诉你不要问”这点很好。很多Apple示例代码都宣扬这一概念。然而,近年来,苹果公司()还提供了一个处理对象图的核心数据堆栈类的示例代码,实际上是放弃了"tell请勿问“模式。
而且,在许多广受欢迎的开源项目中,使用了这种模式。在大多数情况下,您可以减少代码,并且仍然有一个健壮的解决方案。例如,在具有嵌套背景的更复杂的项目中,它通常是唯一可行的设置。
因此,我建议创建一个处理核心数据堆栈的CoreDataManager类,或者对于不太复杂的应用程序(单线程、主线程上下文)使用应用程序委托。
请注意,在Swift中,您确实可以使用全局变量(您应该谨慎地使用这些变量!)来使其非常简洁。例如,在AppDelegate.swift上你可以写
let SharedAppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)(我喜欢利用我的全球单身人士)。您可以如下所示使用这个
do { try SharedAppDelegate.context.save() } catch {}https://stackoverflow.com/questions/35102494
复制相似问题