iOS/SwiftUI

[SwiftUI] @StateObject vs @ObservedObject

CommitGuy 2024. 7. 1. 02:24

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