본문 바로가기

Programming/SwiftUI

[SwiftUI] SwiftUI의 Lifecycle

이번에는 SwiftUI의 Lifecycle에 대해 알아보려 한다. UIViewController를 사용할 땐 아래와 같은 생명주기가 있었다.

 

 

나는 주로 viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear를 사용했던 것 같다.

하지만 SwiftUI를 사용하면서 기존의 UIViewController처럼 생명주기처럼 보이는 게 따로 없어서 이번 기회에 글을 작성해보려 한다.

UIViewController이 궁금하다면 이 글을 참고하면 좋을 것이다.

 

 

 

SwiftUI의 생명주기

항상 그렇듯 공식문서는 한번 확인해보자

Input and Events

 

Input and Events | Apple Developer Documentation

Adds an action to perform in response to a move command, like when the user presses an arrow key on a Mac keyboard, or taps the edge of the Siri Remote when controlling an Apple TV.

developer.apple.com

여기서 Handling View Events를 보면 아래와 같이 나와있다.

onAppear 공식문서

 

onAppear(perform:) - View | Apple Developer Documentation

Instance Method onAppear(perform:) Adds an action to perform when the view appears. Declarationfunc onAppear(perform action: (() -> Void)? = nil) -> some View ParametersactionThe action to perform. If action is nil, the call has no effect.Return ValueA vie

developer.apple.com

onDisappear 공식문서

 

onDisappear(perform:) - View | Apple Developer Documentation

Instance Method onDisappear(perform:) Adds an action to perform when the view disappears. Declarationfunc onDisappear(perform action: (() -> Void)? = nil) -> some View ParametersactionThe action to perform. If action is nil, the call has no effect.Return V

developer.apple.com

두 메서드 모두 크게 볼 건 없다. 중요한 건 perform인데 파라미터로 메서드가 실행될 때 해야 하는 일을 넣어주면 된다.

 

딱 이름만 봤을 때 onAppear은 뷰가 보였을 때, 그리고 onDisappear은 뷰가 사라졌을 때 실행되는 것 같다. 

Swift로 개발을 할 때 자주 들어가는 HACKING WITH SWIFT를 읽어보자,

 

How to respond to view lifecycle events: onAppear and onDisappear - a free SwiftUI by Example tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com

 

이 글에서는 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