leebaek

[SwiftUI] view life cycle | view 생명주기 본문

개발/Swift

[SwiftUI] view life cycle | view 생명주기

leebaek 2023. 10. 31. 18:29

■ view life cycle

- onAppear

- onDisAppear

- onChange

-task 


□ onAppear 

: 뷰가 나타날 때 action을 수행함

 

-뷰가 화면에 나타날 때 초기화 작업을 수행하거나,

-사용자가 특정 뷰로 이동했을 때 무언가를 업데이트하려는 경우에 쓰임

func onAppear(perform action: (() -> Void)? = nil) -> some View
.onAppear {
	// 이 뷰가 화면에 나타날 때 실행될 코드
	// 예를 들어 print("MyView appeared on the screen")
}

> parameters

- action : 수행할 동작 ( *nil이면 아무 동작도 하지 않음 )

 

> return value

- view가 나타날 때, action을 수행한 view를 반환


□ onDisappear

: 뷰가 사라진 후에 action을 수행함

 

-뷰가 사용자에게 표시된 동안 수행한 작업을 정리하거나,

-뷰 컨트롤러가 사라질 때 필요한 처리를 수행하는데 쓰임

func onDisappear(perform action: (() -> Void)? = nil) -> some View
.onDisappear {
	// 이 뷰가 화면에서 사라질 때 실행할 작업을 여기에 작성합니다.
	// 예를 들어 데이터 저장 등
}

> parameters

- action : 수행할 동작 ( *nil이면 아무 동작도 하지 않음 )

 

> return value

- view가 사라질 때, action을 수행한 view를 반환


▽ onAppear, onDisappear 사용

 

NavigationVeiw가 화면에 나타나면, onAppear의 action이 수행되어서 콘솔에 "onAppear" 출력 ( 두번째 사진 )

NavigationVeiw가 화면이 사라지면, onDisAppear의 action이 수행되어서 콘솔에 "OnDisappear" 출력 ( 세번째 사진 )

 

* 사용 코드

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink() {
                Text("Test")
            } label: {
                Text("onAppear")
            }
            .onAppear{ print("OnAppear") }
            .onDisappear { print("OnDisappear") }
        }
    }
}

#Preview {
    ContentView()
}

 


□ onChange 

: 특정 값이 변경될 때, action을 수행함

func onChange<V>(
    of value: V,
    initial: Bool = false,
    _ action: @escaping () -> Void
) -> some View where V : Equatable
.onChange(of: value) { newValue in
    // 실행하려는 작업을 여기에 작성
}

> parameters

-value: 변경될 값 ( 이 값이 변경되면 action 수행됨 )

-newVlaue : 변경된 새 값

-initial: 뷰가 처음 나타날 때, action 수행할지 여부

-action: 수행할 동작

 

> return value

- 특정 값이 변경될 때, action을 수행한 view를 반환


▽ onChange 사용

 

onChange의 vlaue 값을 count로 두었기 때문에, 버튼 클릭으로 count값이 증가할 때마다 action이 수행됨

-count 값이 변경된 View 반환

-콘솔에 "Count has changed to \(newValue)" 출력

 

* 사용 코드

import SwiftUI

struct ContentView: View {
    @State private var count = 0
    
    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1
            }
        }
        .onChange(of: count) { newValue in
            print("Count has changed to \(newValue)")
        }
    }
}

#Preview {
    ContentView()
}

□ task

: 뷰가 나타나기 전에 비동기 작업을 수행함

 

-비동기작업(네트워크 호출, 파일 다운로드 등)을 처리하는데 쓰임

-콜백 함수나 대기 시간을 관리하기가 더 쉽고, 코드도 간결해지는 장점이 있음

func task(
    priority: TaskPriority = .userInitiated,
    _ action: @escaping () async -> Void
) -> some View
Task {
    // 비동기 작업을 수행하는 코드
    let result = await someAsyncFunction()
}
Task(priority: .userInitiated) {
    // 우선 순위가 높은 비동기 작업
    let result = await someAsyncFunction()
}

> parameters

-priority: 작업의 우선순위를 설정

-action : 수행할 동작

 

> return value

- view가 나타날 때, action(비동기 작업)을 수행한 view를 반환