Swift核心数据结构

时间:2016-01-10 11:51:11

标签: ios swift core-data nsmanagedobjectcontext

我开始使用Swift中的Core Data,正如我在许多教程中看到的那样,每个人都只在ManagedObjectContext中使用AppDelegate.swift

在我的应用程序中,我想在多个视图中使用ManagedObjectContext,所以我需要一些共享该对象的机制。

我认为创建一个能够在任何地方管理ManagedObjectContext的课程是一种很好的方法。

我不确定ManagedObjectContext和其他核心数据相关对象是否可能用singleton初始化,这是一个好方法吗?或者我最好在每个视图之间转移ManagedObjectContext(我无法理解为什么会更好)。

您是否对Core数据的使用有一些建议/建议或良好的演示?

2 个答案:

答案 0 :(得分:3)

基本上有三种选择:

  1. 将上下文从应用程序委托对象传递到初始视图控制器,然后再从源视图控制器传递到目标视图控制器。

  2. 由于可以从任何地方访问应用程序委托对象,因此请按照AppDelegate中的模板建议留下核心数据堆栈,然后只需编写

    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
    let managedObjectContext = appDelegate.managedObjectContext
    
  3. 将整个Core Data堆栈移动到一个单独的类中,并将其用作singleton

    class CoreDataManager: NSObject {
    
      class var sharedManager : CoreDataManager {
        struct Singleton {
          static let instance = CoreDataManager()
        }
        return Singleton.instance
      }
    
      // MARK: - Core Data stack
    
      lazy var managedObjectModel: NSManagedObjectModel = {
        // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
        let modelURL = NSBundle.mainBundle().URLForResource("MyModel", withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
      }()
    
    ...
    
      lazy var managedObjectContext: NSManagedObjectContext = {
    
    ...
    

    并用

    调用它
    let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext
    

答案 1 :(得分:3)

StackOverflow上多次提问has been asked。您询问是否应将ManagedObjectContext从视图传递到视图。 The official answer from Apple is yes

  

创建视图控制器时,将它传递给应该使用的上下文。您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文。应用程序委托通常负责创建一个上下文以传递给显示的第一个视图控制器。

     

视图控制器通常不应从全局对象(例如应用程序委托)检索上下文 - 这会使应用程序体系结构变得僵硬。视图控制器也不应为自己的用途创建上下文(除非它是嵌套的上下文)。这可能意味着使用控制器上下文执行的操作未在其他上下文中注册,因此不同的视图控制器将对数据有不同的视角。

这称为dependency injection。您是否选择使用它取决于您。依赖于AppDelegate或创建单独的单身人士来访问managedObjectContext会使您的代码更加“严格”,正如他们所说的那样,并且可能会导致问题。

话虽这么说,很多人都会使用单身人士来做这类事情。这很容易,成本也不会立即显现出来。除了我在上面发布的搜索“依赖注入”的SO链接之外,还会在这里用几句话来解释其优势。