ObservableObject, @ObservedObject, StateObject
ObservableObject
Combine
에서ObservableObject
를 사용하는 이유는 해당 프로토콜을 채택한 객체의 상태 변화를 감지하고 UI에 즉시 실시간으로 반영하기 위해서 입니다.
1
2
3
class ViewModel: ObservableObject {
@Published var count = 0
}
@ObservedObject
ObservableObject
객체가 부모에서 주입되었을때 사용하는 프로퍼티 래퍼이다.ObservableObject
객체가 포함되어있는 뷰에서@Published
프로퍼티가 변경될때 UI를 자동 갱신한다.- 뷰의
1
2
3
4
5
6
7
struct ParentView: View {
@StateObject private var viewModel = ViewModel() // ✅ 부모에서 생성
var body: some View {
ChildView(viewModel: viewModel) // ✅ 자식 뷰에 주입
}
}
1
2
3
4
5
6
7
8
9
10
11
12
struct ChildView: View {
@ObservedObject var viewModel: ViewModel // ✅ 부모에서 받은 객체 감지
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
Button("Increment") {
viewModel.count += 1
}
}
}
}
StateObject
@StateObject
는 SwiftUI에서 뷰가 메모리에서 해제되지 않는 한ObservableObject
를 채택한 객체의 인스턴스를 유지하는 프로퍼티 래퍼입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ViewModel: ObservableObject {
@Published var count = 0
}
struct ContentView: View {
@StateObject private var viewModel = ViewModel() // ✅ StateObject 사용
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
Button("Increment") {
viewModel.count += 1
}
NavigationLink("Go to Next", destination: NextView())
}
}
}
- 인스턴스가 부모를 통해 주입되는 것이 아닌 직접 생성해서 사용할 때 해당 래퍼를 사용함.
This post is licensed under CC BY 4.0 by the author.