🧑💻/Swift
SwiftUI View 생명주기
유리맥
2024. 2. 3. 15:35
반응형
1. init
View 객체가 생성됩니다.
처음 객체가 생성될 때만 수행될 초기화 작업을 넣습니다.
2. onAppear
화면이 표시되기 전 수행할 작업입니다.
2020에 작성된 블로그 글을 보니 onAppear()는 Adds an action to perform when the view appears 였는데
현재 기준으로는 before this view appears 로 바뀌었습니다.
UIKit의 viewDidAppear()와 같다는 논란을 잠재우기 위해 수정하지 않았나 싶습니다.
개인적으로 viewWillAppear() > viewDidLayoutSubviews() 이후, viewDidAppear() 전이라고 생각합니다.
3. task (비동기)
View를 표시하기 전에 비동기 작업을 수행합니다.
비동기 작업이 끝나기 전에 View가 사라지면 자동으로 작업이 중단됩니다.
task는 스레드의 priority를 지정할 수 있습니다.
TaskPriority 우선순위 : high = userInitiated > medium > low = utility > background
다음과 같이 task priority를 여러 개 설정하면
import SwiftUI
struct ContentView: View {
@Environment(\.scenePhase) var scenePhase
var body: some View {
VStack {
Text("Hello, world!")
}
.onAppear {
NSLog("onAppear")
}
.task(priority: .background) { NSLog("Task - background") }
.task(priority: .utility) { NSLog("Task - utility") }
.task(priority: .medium) { NSLog("Task - medium") }
.task(priority: .userInitiated) { NSLog("Task - userInitiated") }
.task(priority: .high) { NSLog("Task - high") }
.onChange(of: scenePhase) { newPhase in
if newPhase == .active { NSLog("Active") }
else if newPhase == .inactive { NSLog("Inactive") }
else if newPhase == .background { NSLog("Background") }
}
}
}
priority에 따라 수행하는 모습을 볼 수 있습니다.
위 코드의 ScenePhase는 앱의 상태를 나타냅니다. onChange 함수를 통해 앱 상태가 변경됐을 때마다 처리할 수 있습니다.
- active : 앱이 활성 상태이고 상호 작용이 가능합니다.
- inactive : 앱이 활성 상태이지만 상호 작용이 불가능한 상태입니다.
- background : 앱이 비활성 상태입니다.
4. onDisappear
화면이 사라진 후 수행할 작업입니다.
UIKit의 viewDidDisappear()와 동일합니다.
참고
- https://developer.apple.com/documentation/swiftui/view-fundamentals
- https://www.hackingwithswift.com/books/ios-swiftui/how-to-be-notified-when-your-swiftui-app-moves-to-the-background
반응형