이전 챕터에서 구현한 앱의 실행을 중단 후 다시 실행해보면 시간이 현재시간으로 바뀐다.
하지만 백그라운드로 보냈다가 (⇧⌘H) 다시 앱을 실행해보면 시간이 바뀌지 않고
그대로이다. 이 문제를 해결하기 위해 앱과 뷰컨트롤러의 라이프 사이클을 이해할 필요가 있다.
앱의 라이프사이클

프로젝트에서 AppDelegate.swift 파일을 열어보면 AppDelegate 클래스내에 몇 개의 메서드가 존재한다. 각각의 메서드는 앱의 상태에 따라 자동으로 호출된다.
application:willFinishLaunchingWithOptions:
처음 앱을 실행한 직후에 호출된다.
application:didFinishLaunchingWithOptions:
앱이 사용자에게 보여지기 직전에 호출된다.
applicationDidBecomeActive:
앱이 활성화 된 직후에 호출된다.
applicationWillResignActive:
앱이 비활성화 되기 직전에 호출된다.
applicationDidEnterBackground:
앱이 백그라운드 상태로 진입한 직후에 호출된다.
applicationWillEnterForeground:
앱이 포어그라운드 상태로 진입한 직후에 호출된다. 아직 inactive 상태이다.
applicationWillTerminate:
앱이 완전히 중단되기 직전에 호출된다.
뷰컨트롤러의 라이프사이클

뷰컨트롤러의 라이프사이클은 해당 뷰컨트롤러 클래스에서 관리한다. 뷰 컨트롤러를 생성하면 자동으로 아래와 같은 메서드가 구현되어 있다.
override func viewDidLoad() {
super.viewDidLoad()
}
뷰가 메모리에 로드된 직후에 호출되는 메서드이다. 가장 먼저 호출되는 메서드이며 원칙적으로 앱이 실행되는 중에 단 한번 호출된다. (메모리 문제로 장담은 못한다.)
아래 메서드는 필요에 따라 구현하여 사용하도록 한다.
viewWillAppear()
뷰가 보여지기 직전에 호출된다.
viewDidAppear()
뷰가 보여진 직후에 호출된다.
viewWillDisappear()
뷰가 사라지기 직전에 호출된다.
viewDidDisappear()
뷰가 사라진 직후에 호출된다.
앱과 뷰의 라이프사이클을 확실히 이해하기 위하여 각각의 메서드안에 해당 메서드명을 문자열로 출력하는
print 문을 입력해보자.
override func viewDidLoad() {
super.viewDidLoad()
print(#function) // print함수가 속해 있는 함수명을 프린트한다.
}
앱을 실행해보면 각각의 메서드가 호출되는 시점을 파악할 수 있다. 포어그라운드에서 백그라운드로(), 다시 포어그라운드로 전환한 후 앱을 종료시켜보자. (시뮬레이터 메뉴에서 Hardware -> Home 을 클릭하면 아이폰에서 홈버튼을 터치한 기능이 동작한다.)
우리가 원하는것은 백그라운드에서 포어그라운드로 전환될 때 호출되는 메서드이다. 뷰가 다시 화면에 보여지기 때문에 뷰컨트롤러의 라이프사이클 메서드가 다시 호출될꺼라 생각할 수 있지만 백그라운드로 전환되더라도 이미 뷰는 로드되어 보여지고 있는 중이고, 단지 사용자에 화면에만 보이지 않는 것이기 때문에 뷰의 관련된 메서드는 재호출 되지 않는다. 그렇다면 결국 포어그라운드로 전환될 때 호출되는 메서드는 아래의 메서드뿐이다.
applicationWillEnterForeground()
그렇다면 위의 메서드를 이용하여 어떻게 그 시점에 시간을 업데이트 할 수 있을지 다음 챕터에서 알아보자.