SwiftUI에서 사용하는 어노테이션중 @StateObject와 @ObservedObject는 왜 사용하는 것일까?
@StateObject & @ObservedObject
- 둘다 관찰중인 객체의 변경에 반응해서 화면(UI)을 업데이트 할 수 있게 해주는 SwiftUI의 Property Wrapper이다
그렇담 StateObject와 ObservedObject의 차이는 무엇일까?
@ObservedObject
- StateObject와 ObservedObject는 둘 다 "ObservableObject"라는 Protocol을 따른다
final class CounterViewModel: ObservableObject
{
@Published var count = 0
func incrementCounter()
{
count += 1
}
}
struct CounterView: View
{
@ObservedObject var viewModel = CounterViewModel()
var body: some View
{
VStack
{
Text("~~ \(viewModel.count)")
Button("~~~~")
{
viewModel.incrementCounter()
}
}
}
}
위 코드를 보면 CounterViewModel은 "ObservableObject" Protocol을 따르기에 @ObservedObject annotation으로 정의가 가능해진다
count 변수에 @Published를 사용하여 값에 변화가 있을시 신호를 쏴서 변화를 알게 한다
변화를 감지해 Text를 업데이트 해준다
@StateObject
StateObject는 ObservedObject와 비슷하게 작동하나 @StateObject는 관찰되고 있는 객체가 그 객체를 포함하고 있는 화면 구조가 재생성되어도 파괴되지 않는다
즉, SwiftUI가 화면을 만들거나 다시 그릴 수 있는 가능성이 있는 경우엔 내부에 @ObservedObject를 쓰는것은 안전하지 않다
즉, 둘은 동작은 비슷하나 화면이 파괴되거나 재생성 될 때 값이 유지되느냐 그렇지 않느냐의 차이이다.
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] @State vs @Binding (0) | 2024.07.02 |
---|