안녕하세요 iOS 개발자 루크입니다
MVVM 패턴과 찰떡궁합 프로퍼티 래퍼인
오늘은 @ObservableObject 에 대해서 배워 보려고 합니다
Swift 에서는 변수와 View 를 엮어주는 바인딩이라는 강력한 개념이 존재합니다.
변수, 즉 데이터가 수정되면 이에 따라 View 도 같이 수정해주어 사용자에게 즉시 수정된 데이터를 보여줄 수 있죠.
이러한 기능을 커스텀 클래스에도 적용할 수 있답니다.
바로 @ObservableObject 프로퍼티 래퍼를 사용한다면요!
한번 알아봅시다!
들어가기전에...
해당 기능을 사용하기 위해서 우리는 다른 놈들도 함께 알아봐야합니다.
ObservableObject 란?
이 프로토콜을 클래스에 채택하면 클래스의 인스턴스는 관찰이 가능해집니다. (말그대로요 ㅋㅋ)
누가 이 뷰를 관찰하냐? 바로 View 입니다.
SwiftUI 의 View 는 인스턴스를 관찰하고 있다가 해당 인스턴스가 변경되면 뷰를 Refresh 해주게 됩니다.
@Published
ObservableObject 에서 속성을 선언할 때 사용하는 PropertyWrapper입니다. @Published 로 선언된 속성이 ObservableObject
에 포함되어 있다면 해당 속성이 업데이트 될 때마다 뷰를 업데이트 합니다.
@ObservedObject
ObservableObject를 구독하고 값이 업데이트 될 때 마다 뷰를 갱신하는 PropertyWrapper입니다.
관찰하고자 하는 인스턴스를 해당 프로퍼티래퍼로 선언해주면 됩니다.
사용법
사용법을 정리해보자면!!
1. 관찰가능하게 하고자 할 클래스에 ObservableObject 프로토콜을 채택한다
2. 해당 클래스내부에 관찰하고자하는 프로퍼티들을 @Published 프로퍼티를 사용해서 선언한다.
3. 관찰하고자 하는 클래스의 인스턴스를 @ObservedObject 를 사용해서 선언한다.
4. 이렇게 선언된 인스턴스는...
다른 뷰에 건네주어도 서로 Binding 되어 해당 인스턴스가 변경되면 이를 감지하고 건네진 모든 View 를 다시 그리게 됩니다!
A property wrapper type that subscribes to an observable object and invalidates a view whenever the observable object changes.
공식문서에서도 해당 프로퍼티 래퍼타입으로 선언된 observable 한 객체는 수정될 때마다 해당 객체와 연관된 View를 모두 다시 그리게 된다고 적혀져 있네요
상당히 강력한 기능이지만 치명적인 오류가 발생하기도 합니다..
무슨 오류냐면...
State 변수와 함께 사용하는 경우,... 해당 변수가 수정되면 하위 View 들을 모두 다시 그리게 되는데... 이 말이 무섭습니다.
모두 다시 그린다 = init() 즉 모두 초기화한다는 말과 같습니다.
이렇게 되면 viewModel 을 소유하고 있는 즉, Observable 한 인스턴스도 함꼐 초기화 된다는 치명적인 오류가 발생하죠...
해당 오류와 관련된 내용은 아래 블로그
에 잘 정리해주신 것 같으니 참고하시면 좋을 듯 합니다.
오늘 포스팅은 여기서 마무리하도록 하겠습니다 감사합니다