SwiftUI

SwiftUI View Lifecycle에 대해 알아보자.

Phililip
728x90

안녕하세요.

 

그동안 대충은 알고 있었던 SwiftUI의 View Lifecycle에 대해서 정확하게 알고 가는 시간을 가져볼게요.

 

개인적으로 Lifecycle 개념도 중요하지만, Lifecycle이 정확하게 언제 호출되는지 (ex. 렌더링 전? 뷰 계층 제거된 후?)도 중요하다고 생각하기 때문에 로그 찍어보면서 하나씩 살펴보려고 합니다.

(관련 공식 문서가 별로 없더라구요.. 그래서 추측성 분석이 될 수도 있을 것 같아요ㅠ)

 


# Lifecycle method

## onAppear

View가 보이기 전에 action을 수행하는 함수입니다.

 

View가 첫 렌더링 되기 전에 action 클로저가 끝나는 것을 보장합니다.

 

 

그래서 아래처럼 onAppear에 수행시간이 오래 걸리는 action을 등록하면, 그만큼 화면이 늦게 출력됩니다.

(2초 sleep이 끝난 이후에 화면이 출력되는 것을 볼 수 있어요.)

 

 

 

## task

iOS 15 이상부터 사용할 수 있는 함수입니다.

 

View가 보이기 전에 비동기 task를 수행하는 함수입니다.

 

비동기 task이기 때문에 task가 끝나기 전에 View가 그려질 수 있습니다.

 

또한, task가 끝나기 전에 View가 사라지게 되면(disappear) 자동으로 task를 취소(cancel) 시킵니다.

 

 

아래 예시를 보면 View가 보이고 나서 task가 완료되는 것을 볼 수 있습니다.

 

 

 

추가로 task 함수에는 task(id:priority:_:) 라는 함수도 존재합니다.

 

이 함수는 View가 보이기 전 뿐만 아니라 Equatable 프로토콜을 준수하는 특정 변수의 값이 변할 때에도 task를 수행시킵니다.

(아래 예시를 보면 toggle 할 때마다 task가 수행됩니다.)

 

 

 

그리고 만약 task가 완료되기 전에 값이 바뀌게 된 경우, 기존 task를 cancel 시키고 새로운 task를 수행합니다.

 

 

 

## onDisappear

View가 사라지고 난 이후에 action을 수행하는 함수입니다.

(예시는 생략할게요..ㅎ..)

 

 

 

# 여러 가지 궁금한 거 알아보기

이제부터, 개인적으로 궁금한 것들 직접 호출해 보면서 확인해 볼게요.

 

## onAppear와 task 중 먼저 호출되는 것은?

결론

- 판단할 수 없다.

- 테스트했을 땐 항상 onAppear가 먼저 호출되긴 하지만, onAppear가 먼저 호출된다고 장담할 수 없다.

 

 

 

## Navigation 이동(push, pop)할 때 onAppear, onDisappear가 호출될까?

결론

- NavigationView 자체는 onAppear만 호출된다. (새로운 화면이 push 되어도 NavigationView의 onDisappear는 호출되지 않는다.) (만약 NavigationView 자체가 사라지는 경우에는 onDisappear가 호출된다.)

- 부모 View 위에 자식 View를 push 했을 때 자식 View의 onAppear가 호출되고 부모 View의 onDisappear가 호출된다.

- 자식 View가 pop 됐을 때, 부모 View의 onAppear가 호출되고 자식 View의 onDisappear가 호출된다.

 

 

 

## TabBar 이동했을 때 onAppear, onDisappear가 호출될까?

결론

- TabBar 터치로 인해 화면 이동했을 때 이전 View에선 onDisappear가, 보여질 View에선 onAppear가 호출된다.

 

 

 

## fullScreenCover로 View를 덮으면 onDisappear가 호출될까?

결론

- fullScreenCover로 View가 덮여도 onDisappear는 호출되지 않는다.

- fullScreenCover로 인해 View가 다시 보여도 onAppear는 호출되지 않는다.

 

 

 

## UIKit의 viewWillAppear와 SwiftUI의 onAppear를 같이 사용하면 어떻게 될까?

결론

- viewDidLoad가 제일 먼저 호출된다.

- viewWillAppear, onAppear 모두 호출된다. (순서는 보장할 수 없을 듯..)

 

 

 

# 참고

- https://developer.apple.com/documentation/swiftui/view/onappear(perform:) 

- https://developer.apple.com/documentation/swiftui/view/task(priority:_:) 

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

 


이번 글은 여기서 마무리.

 

 

 

반응형