참조
https://academy.realm.io/kr/posts/slug-wendy-lu-data-consistency/
위 게시글을 보고 정리한 글 자세한 내용은 위 링크 참조 바람당
앱에서 동시성과 멀티 스레드 기능에 대한 요구가 증가할수록, 앱의 기본이 되는 모델 계층을 자 구성해야 합니다. 변경 가능한 시스템에서는 같은 값을 참조하고 있는 두 개의 뷰 컨트롤러가 있으면, 두 번째 뷰 컨트롤러가 이를 읽는 동안 첫 번째 뷰 컨트롤러가 이 값에 대해 쓰는 동작을 수행한다면, 두 번째 뷰 컨트롤러는 정확하지 않은 값을 읽어들일 가능성이 존재하며 이는 앱 크래쉬의 원인이 될 수도 있습니다.
모델을 바꿀 수 없게 되었는데, 어떻게 모델을 갱신하거나 변경할 수 있을까요 ? 변경 불가능 시스템에서는 모델들은 한 번 생성되고 나면 변경할 수 없으며, 모델을 갱신할 수 있는 유일한 방법은 모델 객체의 새로운 인스턴스를 생성하는 방법밖에는 없습니다.
모델을 업데이트 하는 또 다른 방법은 Builder
객체를 이용하는 것입니다. 이는 모델 필드에 저장된 것을 모두 가지고 있는 모델을 변경 가능한 모델로 표현하는데 사용되는 일반적인 방식입니다.
let pin = Pin(builder: pinBuilder)
// Pin(Immutable)
imageURL = "https://www.123.com"
title = "The best pin in the world"
board = "Cute Cats"
// PinBuilder(Mutable)
imageURL = "https://www.123.com"
title = "Meow"
board = "Cute Cats"
Pin Bulider
는 변경 가능하기 때문에 어떤 것이든 요구조건에 맞게 수정할 수 있습니다.
이전 변경 가능한 시스템에서는 KVO
를 사용했다고 함. 하지만 변경 불가능한 시스템에서는 사용이 x. 왜냐하면 변경 불가능한 시스템에서는 변하지 않는 모델 객체에 대한 1개의 인스턴스만 관찰할 수 있으며, 이 모델은 변하지 않기 때문이다.
핀터레스트에서 모델 변경 사항을 알리기 위해 선택한 것은 NSNotification
기반 시스템이다.
NotificationManager
라고 불리는 헬퍼 클래스를 통해 이러한 작업을 처리하고 있다. 이는 모델 갱신 여부를 관찰하기 위해 addObserverForUpdatedModel
메서드를 제공하며, 이 메서드는 NotificationCenter
의 addObserver
메서드를 호출하는 역할을 담당한다.
나도 궁금했던 부분인데, RxSwift
를 채택하지 않은 이유로 36명 이상으로 구성된 개발팀이 RxCocoa, RxSwift
를 익히려면 상당한 시간이 소요될 것으로 판단했다고함. 언젠가는 이것을 사용할 수도 있을것이라고 하심. 지금은 사용하고 있을거같긴함
다른 질문으로 이런 변경 불가능 시스템 모델은 UI
에 사용하고 있다고 함. 그리드에 있는 모든 Pin Cell
의 경우, 셀을 구성할 수 있는 setPin
이라는 메서드를 가지고 있다고 함. 어떤 곳에서는 뷰 모델을 사용하고 있지만, 대부분의 경우 모델을 직접 사용한다네요