본문 바로가기
Swift

[상태 관리] Swift - observable, View life cycle

by yj.yoon 2023. 10. 24.

참고 : 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 위주로 해봐야지

네비게이션 조사도 해야하고,,