🧑‍💻/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()와 동일합니다.

 

참고

 

반응형