참고 : https://developer.apple.com/tutorials/app-dev-training/making-classes-observable
https://developer.apple.com/tutorials/app-dev-training/responding-to-events
이번에는 상태 관리(State Management)에 대해서 간단하게 정리해보려고 한다.
Making a class observable
class ScrumTimer: ObservableObject {
@Published var activeSpeaker = ""
@Published var secondsElapsed = 0
@Published var secondsRemaining = 0
// ...
}
- ObservableObject protocol을 사용해서 클래스를 생성하면 클래스를 관찰 가능하다.
- 객체의 변경사항을 모니터링한다.
struct MeetingView: View {
@StateObject var scrumTimer = ScrumTimer()
var body: some View {
VStack {
ChildView(timer: scrumTimer)
}
}
// ...
}
- @StateObject를 사용해서 observable (관찰 가능한) object를 생성하면, 앱의 화면(or View) 안에서 객체 state를 생성할 수 있다.
- 상위 코드의 scrumTimer을 하위 코드에 timer이란 아름의 params로 전달.
struct ChildView: View {
@ObservedObject var timer: ScrumTimer
// ...
}
- 상위(parent)로부터 object를 전달받는 뷰에 @ObservedObject을 사용하면, 이 상위 구조체에서는 객체를 생성하고 소유한다. 그래서 하위(child)뷰에서는 초기화 값(initial value)이 필요하지 않는다.
struct ParentView: View {
@StateObject var scrumTimer = ScrumTimer()
var body: some View {
VStack {
ChildView()
.environmentObject(scrumTimer)
}
}
// ...
}
struct ChildView: View {
var body: some View {
GrandchildView()
}
}
struct GrandchildView: View {
@EnvironmentObject var timer: ScrumTimer
// ...
}
- 복잡한 뷰의 계층에서 observable object를 공유하기 위해서는 값을 초기화해서 전달하는 방법 대신에 @EnvironmentObject를 사용한다.
- @EnvironmentObject는 하위 뷰의 하위의 코드에도 접근하도록 해준다. 이는 불필요한 존속성을 피하게 한다.
- ParentView와 GrandchildView는 둘 다 ScrumTimer에 의존하지만, ChildView는 아니다.
Responding to events
앱이 실행되는 동안, 화면은 세 단계 사이에서 전환될 수 있다.
- Active : 유저와 상호작용이 가능한 화면이 전면인 상태
- Inactive : 화면은 보이지만 해당 화면과의 인터랙션은 불가능. 예를 들어, 멀티태스킹 모드에서 다른 앱들과 함께 앱의 패널을 볼 수 있지만 이건 활성화된 패널이 아님
- Background : 앱은 실행중이지만, 그 화면은 유저에게 보이지 않음
View life cycle events
SwiftUI includes three modifiers that respond to view life cycle events:
- onAppear(perform:) : 처음이 아니더라도, 화면에 뷰가 나타날 때 트리거
- onDisappear(perform:) : 뷰가 화면에서 사라질 때 트리거
- task(priority:_:) : 뷰가 화면에 나타나기 전에 비동기적으로 실행되는 작업을 트리거
이제 SwiftUI 위주로 해봐야지
네비게이션 조사도 해야하고,,
'iOS | SwiftUI' 카테고리의 다른 글
SwiftUIIntrospect 빌드 에러 해결 과정 - has no member 'v18' (0) | 2024.11.01 |
---|---|
더 나은 iOS 개발자가 되기 위한 팁 (번역, 요약) (0) | 2023.11.16 |
[디자인 패턴] MVVM 요약 정리 with Swift (0) | 2023.10.23 |
[TIL] 스위프트 공식 튜토리얼 따라하기(2) - 카드 뷰(card view) 만들기 (1) | 2023.10.16 |
[TIL] 스위프트 공식 튜토리얼 따라하기(1) - 스택을 이용한 배열 (0) | 2023.10.13 |