observable object를 subscribe 하거나 observable object의 변화에 따라 view를 무효화하고 싶을때 사용하는 property wrapper
@ObservableObject property wrapper는 view에서 생성되거나 소유하고 있지 않은 observable object를 wrapping 합니다.
@StateObject와 동일한 type의 객체에 적용되고 비슷한 기능을 제공합니다만
view 내부에서 instance를 생성하는 @StateObject와 달리 @ObservedObject는 view 내부에서 instance를 생성하지 않고 주입받습니다.
struct DataOwnerView: View {
@StateObject private var provider = DataProvider()
var body: some View {
VStack {
Text("provider value: \(provider.currentValue)")
DataUserView(provider: provider)
}
}
}
struct DataUserView: View {
@ObservedObject var provider: DataProvider
var body: some View {
// create body and use / modify `provider`
}
}
DataOwnerView는 DataProvider instance의 reference를 DataUserView에 주입하고, DataUserView는 @ObservedObject로 사용합니다.
SwiftUI 내부적으로 뷰 리렌더링 시 @ObservedObject 값을 유지하지 않습니다.
대신 SwiftUI는 부모 view에서 @ObservedObject를 주입받을것을 알고있기 때문에 @ObservedObject 값을 사용할 수 있습니다.
앞서 이야기 했듯이 view에서 값을 소유한다면 @StateObject, 주입받는다면 @ObservedObject로 사용합니다.