-
SwiftUI View 생명주기🧑💻/Swift 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
반응형