ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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()와 동일합니다.

     

    참고

     

    반응형

    댓글

Designed by Tistory.