뷰컨트롤의 생명주기
ViewController 의 생명주기 메서드는 얼핏보면 많고 복잡해 보이지만 메서드의 이름으로 잘 설명이 되어있어 생각보다 그렇게 어렵지는 않다.
- viewDidLoad
먼저 viewDidLoad의 메소드는 이름 그대로 view가 메모리에 로드되고 난 후 딱 한번 호출되는 메서드이다.
해당 메소드는 시스템에 의해 자동으로 호출되기 떄문에 일반적으로 리소스나 화면의 구성요소들을 초기화 하는 용도로 사용된다.
- viewWillAppear
viewWillAppear 라는 메소드명은 view가 보일 예정이다 라는 뜻으로 말 그대로 View 가 보이기 직전, 즉 만들어진 ViewController가 View 계층 구조에 추가되기 직전에 호출된다.
이는 메모리 로드와는 상관없이 현재 화면에 해당 View가 보이는지에 대해서만 영향을 받기 때문에 생성 시 딱 한번 호출되는 viewDidLoad와 달리 View가 화면에 나타나기 직전마다 호출된다.
- viewDidAppear
이 메서드는 말 그대로 View가 화면에 나타난 직후 호출된다.
이는 ViewController가 View 계층 구조에 추가된 직후를 뜻하며, viewWillAppear 메서드의 다음 단계이다.
- viewWillDisappear
앱을 사용하면서 다른 화면으로 넘어가거나, 이전 화면으로 돌아갈때 현재 사용하던 화면은 사라진다. 이렇게 현재 View가 화면에서 사라지기 직전에 viewWillDisappear 메서드가 호출된다.
이는 ViewController가 View계층 구조에서 사라지기 직전을 뜻한다.
- viewDidDisappear
마지막으로 이 메서드는 ViewController가 View 계층 구조에서 사라진 직후, 즉 View가 화면에서 사라진 직후에 호출된다.
간단한 예제로 이해하기
처음 앱이 열렸을때 첫번째 VC에는 viewDidLoad, viewWillAppear, viewDidAppear 이렇게 순차적으로 메서드가 실행된다.
그 다음 버튼을 눌러 다음 2번째 VC로 이동하는 경우, 먼저 VC-2 의 viewDidLoad가 호출되고 , VC-1 의 viewWillDisappear가 호출되게 된다.
그 후 차례대로 viewWillAppear , viewDidAppear가 호출되고 이전 화면인 VC-1 은 viewDidDisappear가 호출되게 된다.
그 다음 다시 back 버튼을 눌러 첫번째 VC로 넘어가게 되면 VC-2 viewWillDisappear 가 호출되고 VC-1 viewWillAppear , viewDidAppear가 호출된 후 VC-2 viewDidDisappear가 호출되게 된다.
여기서 처음 앱을 열었을때와 다른 점은 VC-1의 viewDidLoad가 호출되지 않는다는 점이다.
이렇게 viewDidLoad는 처음 한번만 호출되는 메서드임을 잊지말고 기억하자 :)
App의 생명주기 (Life Cycle)
App의 생명주기는 App의 실행/종료 및 App이 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 상태에 의해 App의 상태가 전환되는 과정을 뜻한다.
App은 여러가지 앱이 한번에 실행될 수 있고, 어떤 App을 사용하다가 다른 앱을 사용할 수 있다. 그렇다면 앱이 다른 앱으로 전환될 수 있고 백그라운드로 전환될 수 있다. 또는 앱이 완전히 종료될 수도 있다.
이런 시점에 운영체제가 자동으로 호출하는 메서드가 존재하며, 이러한 메서드 실행 과정을 앱의 생명주기라고 한다.
프로젝트에서 앱의 생명주기는 AppDelegate와 SceneDelegate에 의해 관리된다. 여기서 Delegate는 테이블 뷰 등 사용되는 델리게이트와는 다른 개념이라고 생각하는 편이 좋다 🙂
Foreground/Background
- Foreground
사진과 같이 내가 네이버 앱을 켜놓고 사용하고 있다면 이 상태가 Foreground 상태이다.
- Background
이 상태로 있다면 바로 Background 상태인 것
앱의 생명주기를 왜 알아야 할까?
Fourground 상태인 앱은 화면을 점유하고 있기 때문에 시스템 리소스보다 높은 우선순위를 가지고 있다.
Background 상태인 앱은 최소한의 작업을 수행해야 한다.
앱의 상태에 따라 그에 맞는 동작을 수행시켜야 하기 때문에 앱의 생명 주기를 파악하고 있어야 한다.
앱의 생명주기를 알아야 구현할 수 있는 기능도 존재한다.
앱의 라이브 사이클
- Not Running : App이 실행중이지 않은 상태
- Foreground : App의 실행화면을 사용자에게 보여주고 있는 상태
- Active : 사용자가 App을 100% 컨트롤 할 수 있는 상태
- inActive : App사용 중 전화 또는 문자와 같은 이벤트가 접근한 상태 ( 앱이 잠시 멈춤)
- Background : App의 실행화면이 내려간 상태
- Background Running : App의 화면은 내려갔지만 계속 작동하는 상태를 의미한다. 애플은 보안등의 이유로 Background영역에서 App의 작동을 허용하지 않는다. 하지만 일부 App은 작동이 가능하다.
- Suspended : 실행 대기 상태를 의미하며 App의 실행 화면이 내려가면 대부분의 App은 대기상태로 전환된다.
iOS 13 버전 이후로 앱의 생명주기는 SceneDelegate 에서 컨트롤이 가능하다. 위에서 말한 앱의 현재 상태를 뷰 생명주기와 마찬가지로 각각의 상태에 따라 메서드로 구분되어 세세한 설정이 가능하다.
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
}
func sceneWillResignActive(_ scene: UIScene) {
}
func sceneWillEnterForeground(_ scene: UIScene) {
}
func sceneDidEnterBackground(_ scene: UIScene) {
}
위와 같이 각각의 상태에 따라 메서드가 친절하게 작성되어 있어 각 시점에 따라 알맞는 메서드를 사용하면 된다.
'◽️ Programming > iOS' 카테고리의 다른 글
iOS TestFlight에 대해서 알아보자 (1) | 2024.06.19 |
---|---|
MVVM 디자인 패턴 알아보기 🧑🏻💻 (0) | 2024.05.10 |
iOS Result 타입 (예외처리) (0) | 2024.04.16 |
iOS 비동기처리(async) 동시성 프로그래밍(Concurrent) (2) (0) | 2024.04.15 |
iOS 비동기처리(async) 동시성 프로그래밍(Concurrent) (1) (1) | 2024.04.15 |