ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210426 - TIL
    TIL/2021 2021. 4. 28. 01:20

    CoreData

    서버에서 데이터를 가져오면 이 데이터를 CoreData에 저장해서 간단한 작업들은 다음에 네트워크 요청을 하지 않고 이 데이터를 이용하여 처리하기 위해서 CoreData 공부를 해야 했다.

    전에는 어렵다고 느꼈는데 다시 공부해보니.... 쉽게 느껴졌다.

     

    CoreData

    • 데이터를 저장하고 출력하는 기능을 쉽게 구현 가능!
    • Persistent Cotainer: NSPersistentContainer
      • 4가지 중요 객체 - CoreDataStack
        • Persistent Store: NSPersistentStore
          • 영구 저장소
        • Object Model: NSManagedObjectModel
          • 데이터들의 관계, 어떤 데이터가 들어가는지
        • Persistent Store Coordinator: NSPesistentStoreCoordinator
          • 영구저장소의 데이터를 가져오거나 저장하는 객체
        • Managed Object Context: NSManagedObjectContext
          • CoreData를 통해 실행하는 작업을 담당
          • 임시 데이터로 다루고 복사본을 가져온다.
          • 꼭 저장을 해야 영구저장소에 저장이 된다.
    • 사용해보기
    • 프로젝트 시작할 때 Use Core Data를 체크하면 CoreDataStack 초기화와 DataModel이 자동적으로 생성된다.

     

    • 만약 기존 프로젝트에 추가를 시키는 거라면 CoredataModel을 추가해야 한다.
    • 그리고 container 초기화를 직접 해야 한다.

     

    CRUD

    • 그전에 자주 사용하게 되는 context를 속성으로 선언하자
    • persistentContainer.viewContext를 가져오면 된다.
    • Create
      • Entity를 생성하는 방법은 다양하다.
        • NSEntityDiscription이 제공하는 메서드로 생성해보기
          • 이걸 이용하면 타입이 NSManagedObject이기 때문에 속성에 바로 접근이 불가능하다.
          • setValue로 key value를 저장해야 한다.
            • 주의할 점은 value의 형식이 Any이기 때문에 잘못된 타입이 들어가면 crash가 난다. 
    • Read
      • Read 할 때는 fetchRequest를 보내야 한다.
      • NSFetchRequest<T> 으로 되어 있다.
      • 데이터를 가져오면 배열로 return 해준다.
        • 데이터가 없다면 빈 배열이 return
      • value(forKey:)로 값을 가져오는데 Any이기 때문에 typecasting을 해줘야 한다.
    • Update
      • Create와 다를 게 없지만 무엇을 수정해야 할지 target이 필요하다.
      • target만 정한다면 create와 같은데 수정한 후에 꼭 context를 저장하도록 하자.
    • Delete
      • target을 정하고 context의 delete(_:)를 호출하고 저장해주면 된다

     

     

    Managed Object

    • Coredata가 lifecycle을 관리한다.
    • Managed Object를 subclassing한 Entity class를 사용하면 속성을 이용할 수 있다.
      • 이전에 사용한 거에서 crash가 발생한 것을 기억하자

     

     

    Managed Object Context

    • Managed Object는 context내부에 존재하게 된다.
    • Persistent Store에 바로 저장되지 않고 context에 먼저 임시 저장된다.

     

     

    Entity

    • Entity는 UpperCamleCase로 이름을 지어준다.
    • Class의 name은 entity와 연결되는 class의 이름이다.
    • 구별을 쉽게 하기 위해 주로 뒤에 entity를 붙여준다.
    • Class definition으로 하면 entity class가 자동으로 생성된다.
      • 만약 EntityClass를 직접 생성했다면 컴파일 오류가 발생한다.
      • 이 기능은 별도의 기능을 추가하지 않을 때 사용하게 된다.
    • 직접 만들고 싶다면 Manual/None을 선택하면 된다.
      • 쉽게 만들고 싶다면 Editor -> Create NSManagedObjectSubclass를 선택
      • 그럼 두 개의 파일이 생성된다. Class, Extension
        • Extension은 entity를 새로 업데이트하면 초기화된다.
        • Class는 유지된다.
          • 여기서 별도의 기능을 추가하는 것이다.
    • Category/Extension
      • Extension을 자동으로 생성해주고 Class선언은 우리가 생성해야 한다..

     

     Attribute

    • Attribute는 lowerCamelCase 
    • Transient는 영구저장소에 저장되지 않는다.
    • Optional을 빼면 필수항목이 되고 비어있다면 저장할 때 오류가 발생하고 저장되지 않는다.

     

     

    DataManager

    • 기본으로 생성되는 코드는 Appdelegate에 들어가 있어서 매번 접근해서 사용하는 게 비효율적이다.
    • 그래서 DataManager 객체를 하나 만들자.
    • Container를 초기화하고 context를 만들어주자.
    • 그리고 saveContext 메서드를 만들자.
      • context.perform 메서드는 context의 thread에서 코드를 실행한다.
    • 하나의 DataModel을 사용하면 대체적으로 Datastack을 앱 시작시에 초기화하고
      • 특정 Scene에만 필요한 Model이 있다면 Scene시작에 초기화한다
      • 앱 시작시에는 Appdelegate의 didFinishLaunchingWithOptions에서 초기화를 실행한다.

     

    새로운 CRUD

     

    • Create
      • NSManagedObject를 이용하여 Entity를 생성한다.
        • 생성자에 (context:)만 가진 게 있는데 subclass 되어있는 객체만 생성 가능하다.
        • 즉 NSManagedObject()가 아니라 PersonEntity()와 같이 사용해야 한다.
        • 이전과 같이 keyValue인 setValue가 아니라 속성으로 바로 저장할 수 있다.
    • Read
      • [Entity] 배열을 return 하도록 구현한다.
      • 그리고 context.perform이 아닌 performAndWait를 사용한다.
        • block을 모두 실행할 때까지 return하지 않는다.
        • 가져올 때 정렬은 다음에 공부하고 일단 가져오기만 하자
          • sortDescriptor를 사용할 거다.
      • 이전과 똑같이 fetch를 호출하고 list에 저장하자
        • performAndWait에서 구현했기 때문에 list가 채워지고 다음 코드가 실행된다.
      • 그리고 list를 return 하자.
    • Update
      • 역시 target이 필요하다.
      • target을 파라미터로 주면 간단!
    • Delete
      • 마찬가지로 target을 파라미터로 전달!

     

    • KeyValue가 아니어서 안전하다.
    • 간단하게 Entity instance를 만들수 있다.

     


    CoreData를 이용한 간단한 앱 만들어보기

     

    공부한 CoreData를 익히기 위해서 간단한 App을 만들었다.

    ProductDataModel을 만들고 ProductEntityClass를 이용해 CRUD를 구현했다.

     

     

    coredata를 이용한 앱

     

    728x90

    'TIL > 2021' 카테고리의 다른 글

    210429 - TIL  (0) 2021.04.30
    210427 - TIL  (0) 2021.04.28
    210425 - TIL  (0) 2021.04.26
    210422 - TIL  (0) 2021.04.23
    210421 - TIL  (0) 2021.04.22
Designed by Tistory.