상세 컨텐츠

본문 제목

[SwiftUI] Life Cycle(생명주기) 알아보기

iOS 캐기/Swift 캐기

by Atlas 2022. 4. 20. 01:51

본문

728x90
반응형

시나리오:  SwiftUI의 라이프사이클은 UIKit의 라이프사이클과 비교해서 어떻게 표기되고 있는지 궁금해졌다.

 

라이프사이클은 어떤 언어를 공부하든 시작하기에 앞서 꼭 먼저 봐야한다고 생각한다.

그래야 구현하고자하는 기능을 어디에 구현해야할지 잘 설계 할 수 있기 때문이다.

 

애플선생님께서도 이렇게 튜토리얼을 통해서 알려주시니 시간적 여유가 있으시면 꼭 해보시길 권장드림! 

 

 

순서대로 따라하다보면 Section5에서 LiftCycle Events를 확인할 수 있다.

 

 

설명을 보게되면 

onAppear(perform:) 과 onDisappear(perform:)이 있다는 설명이 있다. 

onAppear(perform:)는  뷰가 나타난 후 애니메이션을 시작하고 
onDisappear(perform:)는  뷰가 사라지면 불필요한 리소스를 해제할 수 있습니다.

 

기존에 UIkit과 비교를 하면 

onAppear == viewDidLoad

onDisappear == viewDidDisappear  같다. 

 

사용법 

import SwiftUI

struct HomeView: View {
    var body: some View {
        NavigationView {
            NavigationLink.init {
                DetailView()
            } label: {
                Text("show DetailView")
            }.onAppear {
                print("HomeView onAppear")
            }.onDisappear {
                print("HomeView onDisappear")
            }
        }
    }
}

 

테스트  영상:

 

라이프사이클 동작하는 순서를 로그를 찍어서 보게되면 

swiftUI에서는 viewWillAppear랑 viewWillDisappear를 찾아볼 수 없다. ㅠ

UIKit LiftCycle(왼쪽 ) SwiftUI LiftCycle(오른쪽)

 

 

 

공식문서를 찾아보니 

 

https://developer.apple.com/documentation/swiftui/uihostingcontroller/viewwillappear(_:) 

 

Apple Developer Documentation

 

developer.apple.com

 

SwiftUI calls this method before adding the hosting controller’s root view to the view hierarchy. You can override this method to perform custom tasks associated with the appearance of the view. If you override this method, you must call super at some point in your implementation.

SwiftUI는 호스팅 컨트롤러의 루트 뷰를 뷰 계층에 추가하기 전에 이 메서드를 호출합니다. 이 방법을 재정의하여 뷰의 모양과 관련된 사용자 지정 작업을 수행할 수 있습니다. 이 메서드를 재정의하는 경우, 구현의 어느 시점에서 슈퍼를 호출해야 합니다.

 

(왠지 안보이니까 아쉬운? 보고싶은 아이들이다. 개발하면서 자주 쓰던 함수들이라.. 한번 기능 구현을 따로 해봐야겠다 ㅎㅎ )

 

자 여기까지는 뷰의 라이프사이클을 보았고 

앱의 라이프 사이클은 onChange(of: perform:) 를 통해서 확인할 수 있다.

UIKit에서는 AppDelegate에서 필요한 함수들을 오버라이딩을 해서 사용했지만 스유에서는 이렇게 써보니 거참 역시 Simple is the best? 인가? 하는 생각이 든다 ㅎㅎ 

 

.backgroud :  화면이 보이지 않는 상태.
.active : 앱이 실행되어 있는 상태 
.inactive : 화면이 보이지만 작업이 중지되어 있는 상태

 

사용법: 

import SwiftUI

@main
struct SwiftUILifeCyclePotatoApp: App {
    @Environment(\.scenePhase) private var scenePhase
    var body: some Scene {
        WindowGroup {
            HomeView()
                .onChange(of: scenePhase) { status in
                    switch status {
                    case .background:
                        print("background")
                    case .active:
                        print("active")
                    case .inactive:
                        print("inactive")
                    default:
                        break
                    }
                }
        }
    }
}

 

테스트영상: 

 

 

마무리 : 

 

 

gitHub:

https://github.com/PotatoArtie/Potato-iOS/tree/master/Labs/SwiftUILifeCyclePotato

 

GitHub - PotatoArtie/Potato-iOS

Contribute to PotatoArtie/Potato-iOS development by creating an account on GitHub.

github.com

 

 

iOS App dev Tutorials:

https://developer.apple.com/tutorials/app-dev-training/managing-state-and-life-cycle

 

Apple Developer Documentation

 

developer.apple.com

 

https://developer.apple.com/documentation/SwiftUI/AnyView/onAppear(perform:) 

 

Apple Developer Documentation

 

developer.apple.com

 

https://developer.apple.com/documentation/swiftui/form/ondisappear(perform:) 

 

Apple Developer Documentation

 

developer.apple.com

 

https://developer.apple.com/documentation/swiftui/form/onchange(of:perform:) 

 

Apple Developer Documentation

 

developer.apple.com

 

https://developer.apple.com/documentation/swiftui/scenephase

 

Apple Developer Documentation

 

developer.apple.com

 

반응형

관련글 더보기

댓글 영역