SwiftUI와 UIKit의 다른 생명주기 방식

SwiftUI와 UIKit은 서로 다른 프레임워크로 각각 고유한 생명주기를 가지고 있다. SwiftUI는 선언형 프레임워크로 뷰의 상태에 따라 UI가 자동으로 업데이트 되도록 설계되어 있고 UIKit은 명령형의 프레임워크로 개발자가 뷰의 변화를 수동으로 제어 해야한다는 특징을 가지고 있다.

 

이러한 특징에서 비롯되어 SwiftUI의 생명주기는 UIKit의 생명주기와 다르게 동작한다. 특히 상태 관리, 화면 전환, 데이터 바인딩의 방식에서 큰 차이가 있다.

 

UIKit의 생명주기를 다룬 글은 하단에 있으니 넘어가도록 하고 SwiftUI에서 이와 같은 역할을 하는 특징에 대해서 알아보도록 하자.

https://dongdida.tistory.com/112

 

iOS View와 App의 Life Cycle (생명주기) 제대로 파해쳐보기

뷰컨트롤의 생명주기 ViewController 의 생명주기 메서드는 얼핏보면 많고 복잡해 보이지만 메서드의 이름으로 잘 설명이 되어있어 생각보다 그렇게 어렵지는 않다. viewDidLoad 먼저 viewDidLoad의 메소

dongdida.tistory.com

 

먼저 첫번쨰로 뷰의 상태이다.

@State 를 활용해 뷰 내부의 상태를 관리하고 상태가 변경되면 해당 상태를 사용하는 뷰가 자동으로 다시 렌더링되는 방식으로 작동한다.

 

@Bindin은 두 뷰(부모, 자식간)간의 상태를 공유할 때 사용되고 하위 뷰가 상위 뷰의 상태를 변경할 수 있게 된다.

 

@ObservedObject, @EnvironmentObject는 외부에서 데이터를 관찰해 상태 변경을 추적하는 역할을 담당하는 것으로 각각의 방식을 사용해 뷰의 상태를 관리하고 추적한다.

 

다음은 생명주기 관련한 특징을 살펴보자

onAppear는 뷰가 처음 화면에 나타날 때 실행되고 비동기 작업을 시작하거나 초기 설정을 할 수 있다.

 

UIKit에서 viewDidAppear와 유사하지만 SwiftUI에서는 viewDidAppear와 다르게 뷰가 다시 렌더링 될 때 마다 호출된다는 특징을 가지고 있다.

 

최초 한번만 호출되거나, 뷰가 다시 나타날 때, 상태 변화에 반응할 때 등 뷰가 다시 렌더링 될 때 마다 호출 된다!!

.onAppear {
    print("뷰가 화면에 나타났습니다.")
}
struct ContentView: View {
    @State private var dataLoaded = false

    var body: some View {
        Text(dataLoaded ? "Data Loaded!" : "Loading...")
            .onAppear {
                loadData()
            }
    }

    func loadData() {
        // 데이터를 가져오거나 초기화 작업을 수행
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            dataLoaded = true
        }
    }
}

onDisappear는 뷰가 사라질때 실행되고 리소스를 해제 하거나 타이머 혹은 네트워크 작업을 중단할 때 유용하게 사용된다. UIKit의 viewWillDisappear 또는 viewDidDisappear와 유사하게 작동한다.

 

뷰가 트리에서 제거될 때마다 호출되고 데이터 정리 및 리소스 해제 시, 일시적으로 사라짐도 포함하여 호출 되는 특징을 가지고 있다.

.onDisappear {
    print("뷰가 화면에서 사라집니다.")
}
struct ContentView: View {
    @State private var isVisible = true

    var body: some View {
        VStack {
            if isVisible {
                Text("I am here!")
                    .onAppear {
                        print("Appeared")
                    }
                    .onDisappear {
                        print("Disappeared")
                    }
            }
            Button("Toggle Visibility") {
                isVisible.toggle()
            }
        }
    }
}

onChange는 특정 값이 변경될 때 호출되는 메서드로 SwiftUI에서 State, Binding 또는 기타 데이터의 변경을 감지해 동작을 수행할 때 유용하다.

 

관찰 중인 값이 변경되면 클로저가 실행되며 구체적인 값 변경을 감지한다. 서로 다른 값에 대해 여러 onChange를 적용해 사용이 가능하다는 것이 특징!

struct ContentView: View {
    @State private var username: String = ""

    var body: some View {
        TextField("Enter your name", text: $username)
            .onChange(of: username) { newValue in
                print("Username changed to: \\(newValue)")
            }
    }
}

마지막으로 SwiftUI에서 뷰는 항상 body를 통해 렌더링 된다. body는 SwiftUI의 핵심이고 상태가 변경될 때 마다 자동으로 다시 호출되어 뷰가 재구성된다.

 

UIKit에서 viewDidLoad와 같은 역할을 하지만, 매번 상태가 변경될 때 마다 실행된다는 차이가 있다.

var body: some View {
    Text("Hello, SwiftUI!")
}

SwiftUI에서 상태가 변경되면 body가 다시 실행되어 UI가 업데이트 되고 이는 UIKit에서 일일이 수동으로 업데이트해야하는 것과 달리 SwiftUI는 선언형 방식으로 상태 변화에 따라 UI가 자동으로 갱신된다는 점이 큰 차이점 중 하나라고 느껴진다.

이와 같이 지금까지 SwifUI를 사용하면서 한번 생각이 났던 생명 주기 관련해서 UIKit과의 차이점에 대해서 알아봤다 🙂

 

오늘은 여기까지!