티스토리 뷰

🍏/SwiftUI + Combine

[SwiftUI] @StateObject

eungding 2021. 8. 31. 11:37
반응형

Managing Model Data in Your App 문서를 보면

App의 모델 데이터와 뷰 간의 connection을 만들어 주는 세가지 property wrapper type 을 소개해줍니다. 

 

- ObservedObject    iOS 13+

- EnvironmentObject  iOS 13+

- StateObject  iOS 14+ 

 

ObservedObject 랑 EnvironmentObject는 작년에 살펴봐서 

안살펴본 StateObject 만 정리해보겠습니다. 

 


StateObject 의 정의 

A property wrapper type that instantiates an observable object.

 

StateObject 왜 필요한가? 

(Managing Model Data in Your App 문서 > Instantiate a Model Object in a View 부분 내용입니다) 

 

SwiftUI는 언제든지 뷰를 다시 만들 수 있습니다. 

그 결과, 뷰 안에서 ObservedObject를 만드는 것은 안전하지 않습니다. 

 

대신에 SwiftUI는 이 목적을 위해 StateObject를 제공해줍니다.

StateObject를 사용하면 뷰안에서 안전하게 ObservedObject 인스턴스를 만들 수 있습니다.

 

 

 

 

StateObject는 ObservedObject 와 같이 동작합니다. 

차이점은 SwiftUI가 뷰를 몇번이나 다시 만드는 지 상관없이 주어진 view instance에 대해 single object instance를 만들고 관리한다는 점입니다. 

 

위의 예제처럼 다른 뷰(BookView)의 observed object 프로퍼티로 state object를 넘길 수 있습니다. 

 

SwiftUI는 각각의 뷰 인스턴스에 대하여 distinct object instance 를 만듭니다. 

그래서 아래의 예제에서 각각의 Library View는 unique Book Instance를 가집니다. 

 

 

또한 top level App instance나 앱의  Scene instances 중 하나에서 state object를 만들 수 있습니다. 

예를 들어 Library라는 observable object 를 정의하여 book reader app의 books collection을 보관하는 경우, 앱의 최상위 구조에 single library instance를 만들 수 있습니다. 

 

 

 

 

반응형
댓글