创建自己的 Core Data Stack

把一些 Core Data 的组件封装出来,成一个单独的类。

创建:CoreDataStack.swift

第一部分创建 Model 的名字和 Document 的路径URL:
创建新的 .swift 文件

    import CoreData
    class CoreDataStack {

      let modelName = "Dog Walk"

      //Document's URL
      private lazy var applciationDocumentDirectory: NSURL = {
        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        return urls[urls.count-1]
      }()
    }

第二步给类添加懒加载的三个属性 NSManagedObjectContextNSPersistentStoreCoordinatorNSManagedObjectModel

     //NSManagedObjectContext
     //Note: ConcurrencyType 的具体参数会在后面补充添加,暂时先使用 .MainQueueConcurrencyType
     //创建出来Context是完全没有意义的,直到设置了Context的PersistentStoreCoordinator
     lazy var context: NSManagedObjectContext = {
       var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
       managedObjectContext.persistentStoreCoordinator = self.psc
       return managedObjectContext
     }()

     //NSPersistentStoreCoordinator
     //对StoreCoordinator做懒加载,StoreCoordinator是介与PersistentStore(s)和ObejctModel之间的,所以至少需要一个PersistentStore。
     private lazy var psc: NSPersistentStoreCoordinator = {
       //coordinator init,传入Model,Model指所有的Entity和所有的relationship
       let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    //    PersisitentStore 的物理存储路径
       let url = self.applciationDocumentDirectory.URLByAppendingPathComponent(self.modelName)
       do{
    //      一些Option配置:
         let options = [NSMigratePersistentStoresAutomaticallyOption : true]
    //addPersistentStoreWithType 选择一个SQLite的type,使用SQLite作为存储模式。
         try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL:url, options: options)
       } catch {
         print("Error adding persistnet store.")
       }
       return coordinator
     }()

     //NSManagedObjectModel
     //这里包含着MainBundle里面的momb文件里面的 `.xcdatamodeld` 文件,就是Xcode图形化设计Entity和Relationship的那个文件,使用它来创建ManagedObjectModel
     private lazy var managedObjectModel: NSManagedObjectModel = {
       let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")!
       return NSManagedObjectModel(contentsOfURL: modelURL)!
     }()

添加的每 Property 都对应着 Core Data 的重要组件,使用Lazy Loading,每个组件都依赖其他的组件。

这些 Property 中只有NSManagedObjectContext是 Public 的 Property,其余的都是 private 修饰。private 修饰的组件外界不需要获取的。

另外,NSPersistentStoreCoordinator可以通过 NSManagedObjectContext的 Public property 获取。

而所有的NSManagedObjectModelNSPersistentStore都可以通过NSPersistentStoreCoordinator的Public property 来获取。

StoreCoordinator做懒加载,它是介与PersistentStore(s)ObejctModel之间的,所以至少需要一个PersistentStore

最后添加一个方法:

    //保存的方法
    func saveContent () {
      if context.hasChanges {
        do {
          try context.save()
        } catch let error as NSError {
          print("Error: \(error.localizedDescription)")
          abort()
        }
      }
    }

AppDelegate中添加LazyLoading的iVar:

    lazy var coreDataStack = CoreDataStack()

didFinishLaunchingWIthOption的方法中可以给rootViewController中的Context赋值了:

    let navigationController = window!.rootViewController as! UINavigationController
    let viewController = navigationController.topViewController as! ViewController
    viewController.managedContext = coreDataStack.context

接下来在合适的时机调用SaveContent方法,这里就是在applicationDidEnterBackgroundapplicationWillTerminate代理方法中调用:

    coreDataStack.saveContent()

到这里,一个CoreData的栈类就创建完成了,并且已经实现了在应用退出的时候对 Context 进行 saveContent 的操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值