NSPersistentContainer를 통한 코어데이터 스택생성하기

Swift 버전

같은 내용인데, Swift 버전의 코드는 아래와 같다. 컨테이너와 컨텍스트는 모두 느긋한 프로퍼티이다.

lazy var container: NSPersistentContainter = {
  let container = NSPersistentContainter(name: "MyDataModelName")
  container.loadPersistentStore{ desc, error in 
    guard error == nil {
      fatalError("Fail to load: \(error!)")
    }
  }
}()

lazy var context: NSManagedObjectContext {
  return self.container.viewContext
}

조금 더 깊이

Swift에서 init(name:) 은 편의 이니셜라이저이다. 만약 이 컨테이너를 서브 클래싱할 때 편의 이니셜라이저를 만드려면 지정 이니셜라이저를 호출해야한다. 컨테이너의 지정 이니셜라이저는 init(name:managedObjectModel:) 이므로 전달된 이름을 가지고 관리 객체 모델을 구해서 이를 호출해야 한다. 관리 객체 모델은 수동 셋업때와 같이 모델 파일로부터 로딩해서 생성하면 된다.

convenience init(completionHandler: @escaping () -> ()) {
  guard let mURL = Bundle.main.url(forResource: "MyDataModelName", withExtension: "momd")
  else { fatalError("Can't load Managed Object Model") }

  guard let mom = NSManagedObjectContext(contentsOf: mURL)
  else { fatalError("Can't initialize MOM") }

  init(name: "MyDataModelName", managedObjectModel:mom)
  completionHandler()
}

참고 자료