상세 컨텐츠

본문 제목

Guide To Swift Codable. Chapter 6: Building a Baggage Scanning App with Core Data

TIL/Swift Codable

by box-jeon 2018. 8. 3. 17:16

본문

Core Data의 'one of the greatest pain points'로 'awkward fetch-or-insert-and-update dance'를 들고 있는데, iOS9과 macOS El Capitan부터 unique constraints를 사용할 수 있게 됨으로써 NSManagedObjectContext를 저장만 하면 자동으로 처리해준다고 합니다. (브런치도 awkward dancing 중인데, 이제 그만 쉬게 해줘야...) NSManagedObjectContext의 mergePolicy를 NSMergeByPropertyObjectTrumpMergePolicy로 설정하면 된다고 하네요. Trump의 뜻을 찾아봐도 왜 trump가 들어가는지 이해가 안가서 문서를 확인해봤습니다.


NSMergeByPropertyObjectTrumpMergePolicy: A policy that merges conflicts between the persistent store's version of the object and the current in-memory version by individual property, with the external changes trumping in-memory changes.


Core Data를 사용하면 NSManagedObject를 상속해야만 하는데, Decodable의 required init을 어떻게 할 것인지가 핵심입니다. JSONDecoder의 userInfo를 이용해 NSManagedObjectContext를 넘겨주고, Decodable의 init에서는 NSManagedObject의 init을 호출하여 객체를 생성합니다. userInfo의 key는 CodingUserInfoKey 타입이므로 extension을 이용해 하나 정의합니다. 이걸 보고 나니 슬슬 userInfo가 요술주머니처럼 보이기 시작합니다.


대체 어떻게 Decodable을 extension으로 conform하는건지 지난 챕터부터 궁금했는데, class를 final로 선언하면 required init도 convenience init으로 작성하는 것이 가능해집니다. struct의 경우 Decodable을 extension으로 conform할 수 있었던 것도 비슷한 맥락이라고 생각됩니다. required init을 convenience init으로 작성함으로써 얻을 수 있는 효과는 NSManagedObject의 init들을 모두 override하지 않아도 된다는 점이겠지요.


관련글 더보기

댓글 영역