안녕하세요 iOS 개발자 루크입니다
오늘은 @ObservedObject 에 이에 @StateObject 프로퍼티 래퍼를 알아보려고 합니다!
본 포스팅은 아래의 포스팅과 이어지는 글입니다.
원활한 이해를 위해서 앞선 포스팅을 읽고와주세요~!
StateObject 란?
문서를 봅시다!
StateObject 는 ObservedObject 는 거의 똑같으나, StateObject 는 하나의 객체로 만들어지고 View 가 얼마나 초기화되든지 상관없이 별개의 객체로 관리됩니다.
즉 앞선 포스팅에서 문제가 되었던게 다른 변수에 의해서 View 가 다시 그려질 때, ObservedObject 도 같이 초기화가 되는 의도치 않은 상황이 자주 발생했는데요.
하지만 StateObject 로 생성된 객체는 View의 라이프 사이클에 영향받지 않습니다.
SwiftUI 가 View 와 별개의 메모리 공간에 저장해 데이터를 안전한게 보관한다고 하네요!!
사용하는 방법은 2가지가 있습니다.
1. 프로퍼티 래퍼 사용
struct ContentView: View {
@StateObject var viewModel = SomeViewModel()
var body: some View {
//Views..
}
}
Swift
복사
2. init 안에서 생성자와 함께 초기화
struct ContentView: View {
@StateObject var viewModel
init() {
self._viewModel = StateObject(wrappedValue: SomeViewModel())
}
var body: some View {
//Views..
}
}
Swift
복사
애플이 권장하는 StateObject 와 ObservedObject 의 사용법
ObservableObject 를 처음 초기화할 때는 StateObject 사용 → 이미 객체화된 것을 넘겨 받을 때 는 ObservedObject 의 사용을 추천
struct UpperView: View {
@StateObject var viewModel: ViewModel = ViewModel()
var body: some View {
LowerView(viewModel: viewModel)
}
}
struct LowerView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
Text("Hello")
}
}
Swift
복사
상위 View 에서 StateObject 를 객체로 만들어서 따로 저장해 하위 View 의 ObservedObject 를 건네주는 방식이면 좋다.
아마 계속해서 StateObject 를 사용해면 SwiftUI 가 해당 데이터를 안전하게 보호하기 위해서 메모리를 계속 따로 할당하기에 StateObject 는 처음 객체화 시에만 사용하는 게 좋다는 의미일 듯 하다.
우선 StateObject 라는 프로퍼티를 사용해서 프로퍼티를 선언하려면, ObservableObject 프로토콜을 준수하는 초기값을 건네주어야한다네요!
이렇게 보니 State ~ Binding 의 관계는 StateObject- ObservedObject 의 관계와 유사하네요. 사용법도 매우 유사한 것 같습니다.
오늘 포스팅은 여기서 마무리하도록 하겠습니다 ~! 감사합니다