Core Data

도윤·2022년 12월 30일
0

Persistence

코어데이터는 객체를 저장소에 세부정보를 추상화하
직접적으로 데이터베이스를 운영하지 않고 Objective-C와 Swift로 데이터를 쉽게 저장할 수 있게 만든다.

Undo and Redo of Individual or Batched Changes

CoreData의 undo manager는 변경 사항을 추적하고 한번에 모두, 그룹단위로, 개인별로 다시 되돌릴 수 있어서 앱에 Undo 및 Redo를 쉽게 추적할 수 있다.

Background Data Tasks

Background에서 Json을 Object로 파싱하는것과 같은 데이터 작업들을 수행한다. 서버로 반복된 요청을 줄이기 위한 결과들을 저장하거나 cache처리할 수 있다.

View Synchronization

CoreData는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화상태로 유지하는 것을 제공한다.

Versioning and Migration

Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있다.

CoreDataStack

  • NSManagedObjectModel: app의 타입, properties, relationships들을 나타내는 Model file
  • NSManagedObjectContext: App의 인스턴스들의 변화를 추적
  • NSPersistentStoreCoordinator: 저장소로 인스턴스를 저장하고 가져오는 기능
  • NSPersistentContainer: context, model들을 설정(set up)하고 한번에 모든 coordiantor를 저장

ersistent Container 생성


AppDelegate에서 Persistent Container을 lazy변수로 생성하여 첫번째 사용이 발생때 까지 인스턴스화를 늦춰야 한다.

  1. NSPersistenceContainer 인스턴스를 lazy var으로 선언
  2. data model의 파일 이름을 인스턴스 생성자에 선언해준다.
  3. persistent store를 불러오고 존재하지 않는다면 생성한다.
class AppDelegate: UIResponder, UIApplicationDelegate {

    ...

    lazy var persistentContainer: NSPersistentContainer = {        
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()

    ...
}

생성되고 나면 persistent container는 model, context, store coordinator 인스턴스를 각각 managedObjectModel , viewContext , persistentStore Coordinator 레퍼런스를 가지고 있다.

Persistent Container를 Subclass하기


NSPersistentContainer는 subclass되도록 의도되었다. data의 subset을 불러오거나 disk에서 영구 데이터를 불러오는 등의 함수처럼 Core Data관련된 코드를 작성하기 좋다.

import CoreData

class PersistentContainer: NSPersistentContainer {    

    func saveContext(backgroundContext: NSManagedObjectContext? = nil) {
        let context = backgroundContext ?? viewContext
        guard context.hasChanges else { return }
        do {
            try context.save()
        } catch let error as NSError {
            print("Error: \(error), \(error.userInfo)")
        }
    }    
}

0개의 댓글