안녕하세요.
이번에는 SwiftUI의 ScenePhase에 대해 알아볼게요.
# 1. ScenePhase
ScenePhase는 현재 Scene의 상태(=lifecycle)를 관리하는 값입니다. (아이폰 앱의 경우 단일 Scene이기 때문에 App이라고 봐도 무관할 듯..?)
Environment에서 scenePhase를 observing 해서 현재 상태값을 읽을 수 있고, onChange(of:perform:) method를 사용해서 값이 변할 때마다 이벤트를 받도록 구현할 수 있어요.
# 2. ScenePhase 종류
ScenePhase에는 총 3가지 값이 있습니다.
(1) active
말 그대로 Scene이 foreground에 있고 interactive(상호작용 할 수 있는) 상태인 경우를 의미합니다.
즉, 아래처럼 앱이 실행되고 있는 경우를 의미합니다.
(2) inactive
Scene이 foreground에 있지만 멈춘 상태를 의미합니다.
(아래처럼 앱 스위칭 화면일 때 inactive 상태가 됩니다.)
(3) background
background는 말 그대로 백그라운드로 내려갔을 때를 의미합니다.
background로 앱이 내려간 상태는 언제든지 앱이 종료될 수 있다는 의미입니다.
(사용자가 직접 종료할 수도 있고, os가 성능상의 이슈로 강제 종료시켜버릴 수도 있어요.)
공식 문서에서는 앱이 종료될 것을 예상해서 background 상태에 진입하면 기존 작업을 정리(cleanup work)할 것을 권장하고 있습니다.
(e.g. 열려 있는 파일 닫기, 네트워크 연결 끊기 등)
# 3. 예제
App 인스턴스에서의 scenePhase는 앱 전체에 대한 상태값을 전파합니다.
(로그가 잘 찍히고 있죠??ㅎㅎ)
View 인스턴스에서의 scenePhase는 현재 View가 포함된 Scene에 대한 상태값만을 전파합니다.
뭔 말이냐....
MyView 인스턴스에서 scenePhase 값을 읽어볼게요.
MyView 라는 View가 화면에 존재하는 경우, 상태값이 변할 때마다 "[MyView] xxx" 로그가 잘 찍히는 것을 볼 수 있습니다.
그런데 MyView가 화면에 존재하지 않은 경우, "[MyView] xxx" 로그가 안 찍히는 것 보이시죠??ㅎㅎ
(MyView의 scenePhase는 MyView가 화면에 존재하는 Scene에 대해서만 관리하기 때문입니다.)
# 참고
- https://developer.apple.com/documentation/swiftui/scenephase
이번 글은 여기서 마무리.
'SwiftUI' 카테고리의 다른 글
matchedGeometryEffect (0) | 2023.01.10 |
---|---|
contentShape (1) | 2023.01.03 |
@FocusState (0) | 2022.12.11 |
텍스트 길이에 맞춰서 자식뷰의 width를 통일시키는 방법 (0) | 2022.06.18 |
View Identity와 transition 관계 (0) | 2022.06.17 |