seong_hye, the developer

SwiftUI) View Life Cycle 본문

IOS/SwiftUI

SwiftUI) View Life Cycle

seong_hye 2022. 10. 27.

 

📘 SwiftUI - View Life Cycle

SwiftUI의 View는 선언형(Declarative) 방식이기 때문에 UIKit과는 전혀 다른 생명주기를 가지고 있음

SwiftUI는 상태(State)나 환경(Environment)의 변화에 따라 뷰를 다시 생성하고 그리기 때문에

UIKit처럼 언제 뷰가 생성되고 사라지는가보다는 상태 변화에 따라 어떤 동작을 해야 하는가에 초점이 맞춰져 있음


🔹SwiftUI View Lifecycle 핵심 개념

개념 설명
상태 기반 @State, @Binding, @ObservedObject 등이 바뀌면 뷰가 재계산(re-render)됨
구조체 뷰 SwiftUI의 View는 구조체라서 상태 변경 시마다 새로운 뷰가 생성되는 것처럼 보임
시스템 주도 뷰 생성 / 파괴 시점을 직접 제어하지 않음
명확한 진입점 onAppear, onDisappear 등으로 뷰의 생명주기를 감지

🔹기본 생명주기 메서드

메서드 설명
onAppear {} 뷰가 처음 나타날 때 또는 다시 보일 때마다 호출
onDisappear {} 뷰가 사라질 때 호출됨
onChange(of:) {} 특정 상태 값이 변경되었을 때 반응
task {} 비동기 작업 전용 (iOS 15+)

 

🔍 onAppear & onDisappear 예제

탭 전환, 화면 전환 등으로 나타나거나 사라질 때마다 호출됨

struct ContentView: View {
	var body: some View {
    	Text("Hello")
        	.onAppear {
            	print("화면에 나타남")
            }
            .onDisappear {
            	print("화면에서 사라짐")
            }
    }
}

 

🔍 onChange (of:) 예제

struct ContentView: View {
	@State private var count = 0
    
    var body: some View {
    	VStack {
        	Button("증가") { count += 1 }
        }
        .onChange(of: count) { newValue in
        	print("카운트 값이 바뀜 \(newValue))
        }
    }
}

 

🔍 task (비동기 작업)

struct ContentView: View {
	@State private var message = ""
    
    var body: some View {
    	Text(message)
        	.task {
            	message = await loadData()
            }
    }
    
    func loadData() async -> String {
    	try? await Task.sleep(nanoseconds: 1_000_000_000)
        return "완료됨"
    }
}

🔹SwiftUI 생명주기 흐름 요약

1. View 구조체 생성

2. body 평가 -> 뷰 계층 생성

3. onAppear 실행 (화면에 나타날 때)

4. 상태 변경 ( State, Binding 등 )

5. View 구조체 재생성

6. body 다시 평가 -> 변경된 뷰만 업데이트

7. 뷰가 사라질 때 onDisappear 실행

 

📌  상태가 바뀔 때마다 뷰는 다시 계산됨

하지만 실제 뷰 그리기(렌더링)는 효율적으로 처리됨


🔹SwiftUI vs UIKit 생명주기 비교

항목 UIKit SwiftUI
뷰 생성 init(), loadView() 상태 변화에 따라 구조체 다시 생성
화면에 표시될 때 viewWillAppear, viewDidAppear onAppear()
화면에서 사라질 때 viewWillDisappear, viewDidDisappear onDisappear()
데이터 변경 감지 X (Notification, KVO 등 필요) O (@State, @ObservedObject, onChange(of:))
생명주기 흐름 명령형 선언형, 상태 기반

 

Comments