자체 Core Data Stack 작성

5391 단어
2017년 05월 16일 17:21:37 업데이트:
한 항목의 최신 실현을 위해 시간이 있으면 잘 수정해 주십시오.

protocol UsesCoreDataObjects: class {
    var managedObjectContext: NSManagedObjectContext? { get set }
}

class CoreDataStack {
    private let modelName: String
    init(modelName: String) {
        self.modelName = modelName
    }
    
    lazy var managedContext: NSManagedObjectContext = self.storeContainer.viewContext
    var savingContext: NSManagedObjectContext {
        return storeContainer.newBackgroundContext()
    }
    
    private lazy var storeContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: self.modelName)
        //persistentStoreDescriptions           ,        
        container.loadPersistentStores { (storeDescription, error) in
            if let error = error as NSError? {
                print("Unresolved error \(error), \(error.userInfo)")
            }
        }
        return container
    }()
    
    func saveContext () {
        guard managedContext.hasChanges else { return }
        do {
            try managedContext.save()
        } catch let error as NSError {
                print("Unresolved error \(error), \(error.userInfo)")
        }
    }
}


분할선 이상은 2017년 05월 16일 17:21:23에 추가된 것으로 다음은 낡은 내용입니다.
간단한CoreDataStack은 사용되는 네 가지 흔히 볼 수 있는 기본적인 종류를 봉인하는 것이다. NSManagedObjectModel,NSPersistentStore,NSPersistentStoreCoordinatorNSManagedObjectContext.
생성: CoreDataStack.swift첫 번째 섹션에서 Model 이름과 Document의 경로 URL 만들기: 새 파일 만들기.swift
import CoreData
class CoreDataStack {

  let modelName = "BALABALA"

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

두 번째 단계는 클래스에 게으름 로드의 세 가지 속성NSManagedObjectContext,NSPersistentStoreCoordinatorNSManagedObjectModel를 추가합니다.
 //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 수식된 구성 요소는 외부에서 가져올 필요가 없습니다.
또한 NSPersistentStoreCoordinatorNSManagedObjectContext의Publicproperty를 통해 얻을 수 있습니다.
모든NSManagedObjectModelNSPersistentStoreNSPersistentStoreCoordinator의Publicproperty를 통해 얻을 수 있다.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 방법에서 루트 ViewController의 Context에 값을 지정할 수 있습니다.
let navigationController = window!.rootViewController as! UINavigationController
let viewController = navigationController.topViewController as! ViewController
viewController.managedContext = coreDataStack.context

다음은 적당한 시기에 SaveContent 방법을 호출한다. 여기는 applicationDidEnterBackgroundapplicationWillTerminate 에이전트 방법에서 호출한다.
coreDataStack.saveContent()

여기에서 CoreData의 창고 클래스가 생성되었고, 응용 프로그램이 종료될 때 Context에 대한 saveContent 작업이 이루어졌습니다.

좋은 웹페이지 즐겨찾기