Search
🇺🇸

@StateObject

부제
카테고리
SwiftUI
세부 카테고리
개념
Combine 카테고리
최종편집일
2022/09/20 08:16
작성중
관련된 포스팅
생성 일시
2022/07/16 15:55
태그
안녕하세요 iOS 개발자 루크입니다
오늘은 @ObservedObject 에 이에 @StateObject 프로퍼티 래퍼를 알아보려고 합니다!
본 포스팅은 아래의 포스팅과 이어지는 글입니다.
원활한 이해를 위해서 앞선 포스팅을 읽고와주세요~!

StateObject 란?

문서를 봅시다!
StateObjectObservedObject 는 거의 똑같으나, 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 의 관계와 유사하네요. 사용법도 매우 유사한 것 같습니다.
오늘 포스팅은 여기서 마무리하도록 하겠습니다 ~! 감사합니다