ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210429 - TIL
    TIL/2021 2021. 4. 30. 03:11

    CoreData

     

    계속 Coredata에 대해서 공부 중이다. 

    계속 정보를 가져올때 network에 요청을 보낼 수 없으니 꼭 필요한 부분이다.

    오늘 공부한 내용은 entity들의 관계와 data를 가져올 때 즉 fetch 할 때 정렬하고 async로 실행하는 방법에 대해서 공부했다.

     

     

    Entity Hierarchy

    • Class의 상속을 생각하면 된다.
    • Abstract Entity는 Abstarct class와 같은 개념이다.
      • Instance를 생성하지 못하게 된다.
    • Paent Entity를 지정해주면 끝!
    • 그럼 attribute가 상속된다.

     

    Entity Relationship

    • Realtionships에서 작성하면 된다.
    • 두개의 Entity를 연결해주는 역할을 한다.
    • To - One Relationship
      • 1:1 대응
      • 이름을 단수로 설정
    • To - Many Relationship
      • 1:다 연결
      • 이름을 복수로 설정
      • Array가 아닌 Set
    • Delete rule
      • 삭제할 때 같이 삭제할 것인지 아닌지 
      • Deny
        • 하나라도 남아있으면 삭제가 안된다.
      • Nullify
        • 소스가 삭제되면 연결된 attribute만 삭제된다.
      • Cascade
        • 삭제할때 같이 삭제된다.
    • Inverse를 적용하면 양방향 연결이 된다.
    • 기본으로 제공되는 CRUD 메서드가 있다.
      • 확인해보고 싶다면 Create NSManagedObject Subclass로 확인해보면 된다.

     

     

    Fetch Request

    • 저장소의 데이터를 직접 가져오지 않고 대부분 context에게 요청한다.
    • request를 만드는 3가지 방법
      • 두 방법은 NSFetchRequest<T> 생성자를 이용한다.
      • 빈 생성자로 만드는 방법
        • 이건 entity를 직접 만들고 request.entity 속성에 entity를 넣어하는데 entity를 직접 만드는 게 귀찮다.
      • (entityName:) 생성자 이용하기
        • entity를 생성안해도 되지만
        • String으로 entityName 오타가 날 수 있어서 위험하다.
      • EntityClass에서 자동으로 생성되는 fetchRequest()를 이용한다.
    • context의 fetch(_:) 메서드로 data를 가져올 수 있다.

     

     

    NSSortDescriptor

    • Fetch 할 때 정렬 방식을 지정할 수 있다.
    • Request의 sortDescriptors 속성에 할당하면 된다.
      • 배열이므로 []로 전달해야한다.

     

     

    ResultType

    • 결과를 4가지 중 하나로 return 해준다.
    • request.resultType에서 지정할 수 있다.
    • 지정하지 않으면 ManagedObject로 return
    • countResultType은 count만 return
      • managedObject로 return한다음 count를 센다면 아주 비효율 적이다.
      • countResultType으로 하면 숫자만 리턴하므로 아주 효율적이다.
    • dictionaryResultType은 특정 attribute만 가져올 때 사용한다.
      • propertyToFetch를 이용하면 특정 attribute를 배열로 지정한다.
    • managedObjectIDResultType
      • 다른 context로 managedObject를 주고받을 때 주로 사용한다.

     

     

    Paging, Scrolling

    • fetchLimit
      • 가져오는 데이터의 수를 결정한다.
      • Top10과 같은데에서 사용하면 좋다.
    • fetchOffset
      • 리턴하는 data의 index를 설정한다.
      • 0이 기본값
      • 1이면 0은 제외하고 1부터 가져오는 것
    • fetchBatchSize
      • 전체 데이터중에 정해진 size만큼 가져오고 더 필요하다면 또 가져온다.
      • 전체 데이터수를 확인하고 지정된 데이터 숫자만큼 가져온다
      • 성능이 더 좋아지므로 사용하면 좋다.

     

     

    AsyncFetchRequest

    • 지금까지 동기로 가져오는 거였고 비동기로 가져올 수 도 있다.
    • NSAsynchronousFetchRequest<T>로 만든다.
    • 기존에 있던 request를 이용해서 비동기로 실행하는 거다.
      • 그래서 생성자를 보면 request를 전달해야 한다.
      • completion에 parameter는 NSAsynchronousFetchResult<T>로 finalResult 속성에 배열로 결과가 담겨있다.
    • 주의점은 context의 excute(request:)를 직접 호출해줘야 한다.

     

     

    MainContext가 아닌 BackgroundContext를 사용하는 방법

    • 지금까지 mainContext를 사용했는데 이는 mainThread에서 실행돼서 mainContext였다.

     

     

    DataModel에서 FetchRequest를 만드는 방법

    • 지금까지 fetchRequest instance를 직접 생성했다.
    • Add Entity 아이콘을 꾹 누르면 추가 옵션이 나오고 AddFetchRequest를 클릭한다.
    • Request 이름을 만들어주고 entity를 선택해준다.
    • filter기능도 있다.
      • +를 누르면 attribute에 따라 filter를 설정할 수 있다.
    • ResultType, FetchLimit, BatchSize도 설정이 가능하다.
    • Predicate도 지정할 수 있다.
    • 이렇게 생성한 request를 가져오려면 Model을 가져와야 한다.
    • context.container.managedObjectModel 속성을 통해서 가져와야 한다.
    • 그리고 model의 4가지 속성이 있다. 
    • fetchRequestTemplate(forName:)을 이용하면 이름으로 가져올 수 있지만 오타에 주의해야 한다.
      • 단점은 model을 수정할 수 없다.
    • 정렬은 코드로 직접 추가시켜야 한다.
      • 이때 crash를 조심해야 한다.
      • fetchRequestTemplate(forName:)로 request의 copy를 생성하고 정렬을 추가시켜야 한다.

     

    Fetched Property

    • 지금 딱히 필요없을거 같아서 다음에 공부하도록 하자

     


     

    Entity Instance 삭제하는 방법

     

    로그아웃을 할 때 저장된 데이터들을 삭제해야 하는데 어떻게 하면 쉽게 지울 수 있을까?? 

    NSBatchDeleteRequest를 이용하면 쉽게 지울수 있는 거 같다.

    마찬가지로 fetchRequest를 이용해야 해서 이름에 오타가 날 수 있으니 enum으로 만들어두고 삭제하는 방법을 택했다.

     

    stackoverflow.com/questions/1383598/core-data-quickest-way-to-delete-all-instances-of-an-entity

     

    Core Data: Quickest way to delete all instances of an entity

    I'm using Core Data to locally persist results from a Web Services call. The web service returns the full object model for, let's say, "Cars" - could be about 2000 of them (and I can't make the Web

    stackoverflow.com

     


    DTO와 VO

     

    밥 먹으면서 유튜브를 보는데 영상이 있어서 보게 됐다.

    마침 내가 서버 -> 클라이언트로 데이터를 보낼 때 원본 데이터보다 필요한 정보만 담은 DTO를 보내기 때문에 궁금해서 보게 됐다.

     

    youtu.be/z5fUkck_RZM

     

     


    면접 준비 정보

     

    저번에 봤던 코딩 테스트 준비 테크 캐스트를 유용하게 봤는데 새로운 테크 캐스트가 올라왔길래 시청했다.

     

    yagom.net/courses/tech-cast-2/

     

    [TechCast] 개발자 면접노하우 - 야곰닷넷

    개발자 면접노하우 멋진 기업에서 개발자로 활약하고 있는 멋쟁이 선배들이 들려주는 이야기를 들어봅니다. 면접을 준비하면서 가장 […]

    yagom.net

     

    728x90

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

    210502 - TIL  (0) 2021.05.03
    210430 - TIL  (0) 2021.05.01
    210427 - TIL  (0) 2021.04.28
    210426 - TIL  (0) 2021.04.28
    210425 - TIL  (0) 2021.04.26
Designed by Tistory.