이번에는 SwiftUI의 Lifecycle에 대해 알아보려 한다. UIViewController를 사용할 땐 아래와 같은 생명주기가 있었다.
나는 주로 viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear를 사용했던 것 같다.
하지만 SwiftUI를 사용하면서 기존의 UIViewController처럼 생명주기처럼 보이는 게 따로 없어서 이번 기회에 글을 작성해보려 한다.
UIViewController이 궁금하다면 이 글을 참고하면 좋을 것이다.
SwiftUI의 생명주기
항상 그렇듯 공식문서는 한번 확인해보자
여기서 Handling View Events를 보면 아래와 같이 나와있다.
두 메서드 모두 크게 볼 건 없다. 중요한 건 perform인데 파라미터로 메서드가 실행될 때 해야 하는 일을 넣어주면 된다.
딱 이름만 봤을 때 onAppear은 뷰가 보였을 때, 그리고 onDisappear은 뷰가 사라졌을 때 실행되는 것 같다.
Swift로 개발을 할 때 자주 들어가는 HACKING WITH SWIFT를 읽어보자,
이 글에서는 viewDidAppear() == onAppear() 그리고 viewDidDisappear == vonDisappear() 라고한다.
테스트해보기 위해 간단한 코드를 작성했다.
//
// ContentView.swift
// LifeCycleTest
//
// Created by Choi on 2020/04/12.
// Copyright © 2020 Choi. All rights reserved.
//
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: SecondView()) {
Text("Hello World")
}
}
}.onAppear {
print("View appear")
}
}
}
struct SecondView: View {
var body: some View {
VStack {
Text("Second View")
}.onAppear {
print("SecondView appeared")
}.onDisappear {
print("SecondView disappeared")
}
}
}
먼저 앱을 실행하면 ContentView가 나온다. 이때 onAppear가 수행된다.
로그를 보면 정상적으로 onAppear가 수행된 것을 볼 수 있다.
그리고 Hello World을 눌렀을 때 아래와 같이 SecondView로 넘어간다.
로그를 보면 "SecondView appeared"가 나오게 된다.
Back버튼을 누르게 되면 SecondView가 정상적으로 disappear 되는 것을 볼 수 있다.
마무리
언젠가 꼭 한번 정리하려 했지만 여전한 귀찮음 때문에 쓰지 않고 있었다. 이번 글도 귀찮음을 겨우 이기고 작성한 거라 퀄리티가 많이 떨어질 것 같다. SwiftUI에서는 UIKit와 달리 생명주기가 (내가 제대로 찾아본 거라면) 두 개밖에 없어 가끔 몇몇 상황에 불편했던 것 같다.
특히 View가 생기기 전에 수행하고 싶은 로직을 onAppear에 넣는다면 그 로직은 onAppear이후에 수행되기 때문에 생각한 대로 안 돌아갈 것이다. 하지만 Apple이 다 생각이 있어서 만들었을 것이니 한번 잘 공부해서 사용해야겠다.
참고자료
HACKING WITH SWIFT
Apple 공식문서
Zedd0202 SwiftUI View Recycle
'Programming > SwiftUI' 카테고리의 다른 글
[SwiftUI] @State 이해하기 (0) | 2019.12.18 |
---|---|
[SwiftUI] List에서 @Binding 전달하기 (2) | 2019.12.17 |