2023.01.12 - [Swift & iOS/SwiftUI] - [SwiftUI] Who is retaining @StateObject and ObservedObject
이전 글에서 누가 Retain하고 있냐에 대해서 알아보았다.
이제 특성의 차이를 알아보고자 한다.
사실 StateObject
와 ObservedObject
는 비슷해 보인다.
하지만 StateObject
의 특징을 기억하면 차이점을 알 수 있을 것이다.
StateObject
의 특성
StateObject
를 통해 관찰되고 있는 객체는 화면이 재생성되어도 파괴되지 않는다.
다음의 예제를 통해서 자세하게 살펴보자
import SwiftUI
struct RandomNumberView: View {
@State var randomNumber = 0
var body: some View {
VStack {
Text("Random number is: \(randomNumber)")
Button("Randomize number") {
randomNumber = (0..<1000).randomElement()!
}
}
.padding()
ObservedView()
.padding()
StateView()
.padding()
}
}
struct ObservedView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("ObservedObject Count is: \(viewModel.count)")
Button("Increment") {
viewModel.count += 1
}
}
}
}
final class ViewModel: ObservableObject {
@Published var count = 0
}
struct StateView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("StateObject Count is: \(viewModel.count)")
Button("Increment") {
viewModel.count += 1
}
}
}
}
ObservedObject의 Count는 초기화가 진행되는데 반해,
StateObject의 Count는 초기화가 되지 않음을 볼 수 있다.
이유는 StateObject의 특성 때문이다!
Randomize number을 통해서 RandomNumberView가 재생성되면
하위 View인 ObservedView도 재생성된다. -> @ObservedObject ViewModel도 재생성된다.
BUT!!
StateView의 StateObejcet는 StateObject의 특성상 파괴되지 않는다!
A state object behaves like an observed object, except that SwiftUI knows to create and manage a single object instance for a given view instance, regardless of how many times it recreates the view.
StateObjecㅅ는 마치 ObservedObject 처럼 행동합니다. 하지만 StaetObject는 SwiftUI가 단일 객체를 만들고 관리합니다.
주어진 View가 얼마나 재생성되는지 상관없이
StateObject로 선언되고 생성된 객체는 SwiftUI가 직접 관리하고 있음을 알 수 있다.
그럼 위의 예제에서 다음을 알 수 있다.
Randomsize number 버튼을 누르면 어떻게 작동하는가?
1. RandomNumberView가 재생성된다.
1. ObservedView 가 재생성된다. -> @ObservedObejcet로 선언된 viewModel이 재생성된다.
2. StateView가 재생성된다. -> @StateObject로 선언된 viewModel은 특성 때문에 재생성되지 않는다.
참고 사이트
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app
https://developer.apple.com/documentation/swiftui/observedobject
https://developer.apple.com/documentation/swiftui/stateobject
https://medium.com/hcleedev/swift-observedobject와-stateobject-4f851ed9ef0d
https://pilgwon.github.io/post/state-object-vs-observed-object
'Swift > Apple Framework' 카테고리의 다른 글
[iOS / SwiftUI] Combine - AnyCancellable (0) | 2023.05.08 |
---|---|
[iOS / SwiftUI] Combine - CurrentValueSubject, PassthroughSubject (0) | 2023.05.02 |
[iOS / Swift] sort() 는 어떤 알고리즘을 쓸까? (0) | 2023.04.22 |
[iOS / SwiftUI] Combine - 맛보기 (2) | 2023.04.21 |
[iOS / Swift] Cache (0) | 2023.04.19 |