반응형
SwiftUI에서 MVVM형태의 코드를 작성하려고 할때 아래와 같은 방식으로 대부분 사용할텐데요
class TestViewModel: ObservableObject {
@Published var name: String?
}
struct TestView: View {
@ObservedObject var viewModel = TestViewModel()
var body: some View {
Text(viewModel.name)
}
}
ViewModel의 Property Wrapper에는 아래와 같이 @StateObject 또는 @ObservedObject를 지정할 수 있습니다.
@StateObject var viewModel = TestViewModel()
@ObservedObject var viewModel = TestViewModel()
둘의 쓰임새가 비슷하여 사용 목적에 따라서 원하는 Property Wrapper를 사용해야합니다.
아래는 둘의 쓰임새가 다른 경우에 대한 설명입니다.
@StateObject와 @ObservedObject는 SwiftUI에서 ObservableObject 프로토콜을 준수하는 객체를 관찰하여 뷰를 업데이트하는 데 사용되는 속성 래퍼입니다. 그러나 둘의 차이점은 객체의 생명주기 관리 방식입니다.
@StateObject 속성 래퍼는 뷰의 생명주기에 따라 뷰 모델 인스턴스를 생성하고 관리합니다. 뷰가 다시 그려질 때마다 새로운 뷰 모델 인스턴스를 생성하지 않고 기존 인스턴스를 재사용하게 됩니다.
반면에 @ObservedObject 속성 래퍼는 뷰가 생성될 때마다 새로운 뷰 모델 인스턴스를 생성하고 뷰의 생명주기에 관계없이 해당 인스턴스를 계속해서 사용합니다. 이로 인해 뷰의 재생성이 많은 경우 불필요한 뷰 모델 인스턴스 생성과 메모리 사용이 발생할 수 있습니다.
따라서, 뷰 모델이 뷰의 생명주기와 독립적으로 존재하고 유지되어야 하는 경우에는 @StateObject 속성 래퍼를 사용하는 것이 적합하고, 뷰의 재생성이 많은 경우에는 @ObservedObject 속성 래퍼를 사용하는 것이 적합할 수 있습니다.
(from. ChatGPT)
참고사이트
반응형
'Programming > Swift' 카테고리의 다른 글
[SwiftUI] 애플에서 제공하는 LazyVGrid 구현 예제 (0) | 2023.07.03 |
---|---|
[Swift] 취소 가능한 Task를 설정하는 방법 (feat. AnyCancelTaskBag) (0) | 2023.04.26 |
Key path를 활용한 Swift Closure 활용하기 (0) | 2023.02.14 |
[WWDC2021] Your guide to keyboard layout (0) | 2022.12.14 |
withCheckedContinuation memory leak 현상 및 해결방법 (0) | 2022.11.21 |