首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速保存通过managedObjectContext

快速保存通过managedObjectContext
EN

Stack Overflow用户
提问于 2016-01-30 13:41:40
回答 2查看 145关注 0票数 0

假设我有一个视图控制器(VCA),它与另一个视图控制器(VCB)连接。在准备转换时,VCA传递它的managedObjectContext (即遵循"tell不要询问“的约定)。VCA还有一个函数saveManagedObjectContext(),用于执行保存和错误处理。

因此,在VCA中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
var managedObjectContext: NSManagedObjectContext? = nil

假设VCB将某个实体添加到从VCA传递给它的managedObjectContext中。

代码语言:javascript
复制
func createSomeEntity() {
    let entity = NSEntityDescription.entityForName("SomeEntity", inManagedObjectContext: managedObjectContext!)
    something = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedObjectContext) as? SomeEntity
}

是否有任何(正确)方法从VCA调用saveManagedObjectContext()函数,而不需要将该函数复制到VCB?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-30 15:15:45

另一种选择是单例类。

创建一个新的Swift文件,将预定义代码替换为

代码语言:javascript
复制
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的整个核心数据堆栈。

现在,您可以从任何地方访问核心数据

代码语言:javascript
复制
let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext 

或者调用保存操作。

代码语言:javascript
复制
CoreDataManager.sharedManager.saveAction(self)
票数 1
EN

Stack Overflow用户

发布于 2016-01-30 14:38:01

“告诉你不要问”这点很好。很多Apple示例代码都宣扬这一概念。然而,近年来,苹果公司()还提供了一个处理对象图的核心数据堆栈类的示例代码,实际上是放弃了"tell请勿问“模式

而且,在许多广受欢迎的开源项目中,使用了这种模式。在大多数情况下,您可以减少代码,并且仍然有一个健壮的解决方案。例如,在具有嵌套背景的更复杂的项目中,它通常是唯一可行的设置。

因此,我建议创建一个处理核心数据堆栈的CoreDataManager类,或者对于不太复杂的应用程序(单线程、主线程上下文)使用应用程序委托。

请注意,在Swift中,您确实可以使用全局变量(您应该谨慎地使用这些变量!)来使其非常简洁。例如,在AppDelegate.swift上你可以写

代码语言:javascript
复制
let SharedAppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)

(我喜欢利用我的全球单身人士)。您可以如下所示使用这个

代码语言:javascript
复制
do { try SharedAppDelegate.context.save() } catch {}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35102494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档