일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 패캠챌린지
- 패스트캠퍼스후기
- 자바
- 코딩자격증
- 패스트캠퍼스
- reactnative강의
- 패캠인강후기
- 파이썬
- 직정인자기계발
- 직장인자기계발
- 자바스크립트
- 패캠강의후기
- 직장인인강
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 오공완
- 패캠reactnative
- 코딩테스트
- 패캠
- 환급챌린지
- 코딩교육
- fastcampus
- 수강료0원챌린지
- 직장인공부
- Today
- Total
라티의 작은 일기장
[20일차] [LED 전광판 앱] ViewController Life Cycle 본문
지난번에 간단히 화면 전환 구현 실습을 진행하였는데, 이번에는 ViewController의 Life Cycle(생명 주기)에 대해 알아보려 한다.
앱 내에서 화면이 전환되면 Root View Controller가 로드 된 이후에 새로운 VC가 나타나거나, 사라지는 일 들이 생기는데
이러한 일들을 담당하는 특정 메소드들에 대해 알아보려 한다.
애플 공식 개발자 레퍼런스 사이트에 방문하면 ViewController의 생명 주기를 표현한 상태 전이 그래프를 하나 찾을 수 있는데,이 그래프를 통해 이해를 하는 것이 가장 좋고 빠를 것 같아서 가져와봤다.
우선 위 그래프의 상태에 해당하는 뷰의 각 상태에 대해 알아보자.
- Appearing : 뷰가 화면에 나타나는 중
- Appeard : 뷰가 화면에 나타나는게 완료된 상태
- Disappearing : 뷰가 화면에서 사라지는 중
- Disappeared : 뷰가 화면에서 사라진 상태
그리고 전이에 해당하는 각 메소드들에 대해서도 알아보자.
- viewDidLoad()
- VC의 모든 뷰들이 메모리에 로드됐을 때 호출
- 메모리에 처음 로드될 때 한 번만 호출
- 보통 딱 한번 실행될 행위를 담당하는 함수를 호출하는 명령문을 이 메소드 안에 작성
- 뷰와 관련된 추가적인 초기화 작업, 네트워크 연결 등
- viewWillAppear()
- 뷰가 뷰 계층에 추가되고, 화면에 보이기 직전에 매번 호출
- 다른 뷰로 이동했다가 돌아오면 재호출
- 뷰와 관련된 추가적인 초기화 작업 담당
- viwDidAppear()
- VC의 뷰가 뷰 계층에 추가된 후 호출
- 뷰를 나타낼 때 필요한 추가 작업
- 애니메이션을 시작하는 작업
- viewWillDisappear()
- VC의 뷰가 뷰 계층에서 사라지기 전에 호출
- 뷰가 생성된 후 작업한 내용을 되돌리는 작업
- 최종적으로 데이터를 저장하는 작업
- viewDidDisappear()
- VC의 뷰가 뷰 계층에서 사라진 뒤에 호출
- 뷰가 사라지는 것과 관련된 추가 작업
갑자기 알아야 할 것이 확 늘어서 View의 각 상태와 이런 메소드들을 잘 이해할 필요성이 궁금한 사람들도 있을 것 같아 나름의 생각을 얘기해보자면, 나중에 앱을 만들게 되면 네트워크 연결이나 데이터 조작 및 관리 등의 작업들을 사용자가 앱을 통해 특정 작업을 실행할 때 유동적으로 진행해줘야하는 일이 생길 것이고, 이 경우에 해당 작업들을 원하는 시점에 실행하도록 지정하려면 개발자는 VC의 생명주기에 대해 잘 알고 있어야하는 것이라고 생각한다.
이제 지난 번에 만든 화면 전환 구현 실습 예제에 약간의 코드를 추가하여 각 메소드들의 호출 시점을 한번 알아보자.
지난 프로젝트 - ViewController를 열어서 다음과 같은 코드를 추가해주자.
override func viewDidLoad() {
super.viewDidLoad()
print("ViewController 뷰가 로드 되었다.")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("ViewController 뷰가 나타날 것이다.")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("ViewController 뷰가 나타났다.")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("ViewController 뷰가 사라질 것이다.")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("ViewController 뷰가 사라졌다.")
}
viewDidLoad 메소드는 이미 정의되어있어서 print문만 추가해주고, 나머지는 새로 override 시켜줘야한다.
그리고 앱을 한 번 빌드해보자.
그러면 앱을 열었을 때 viewDidLoad, viewWillAppear, viewDidAppear 메소드가 차례로 호출된 것을 콘솔창을 통해 알 수 있다.
차례로 생각해보면 다음과 같은 과정을 거쳤음을 생각해볼 수 있다.
- 앱이 실행됨에 따라 모든 VC를 메모리에 로드(viewDidLoad())
- Root View Controller의 뷰가 나타나기 직전에 메소드 호출 (viewWillAppear())
- Root View Controller의 뷰가 나타나고 난 뒤에 메소드 호출 (viewDidAppear())
이제 Segue로 Push 버튼을 눌러보자.
이번에는 viewWillDisappear, viewDidDisappear 메소드가 차례로 호출된 것을 볼 수 있다.
여기서도 다음과 같은 과정을 거쳤을 것이다.
- 사용자가 버튼을 눌러서 등록된 Action 함수에 의해 Segue로 새로운 VC를 Push
- Push된 VC가 화면에 나타나기 직전이므로 기존의 Root View Controller는 화면에서 사라지기 전(viewWillDisappear())
- Push된 VC가 화면에 나타난 뒤이므로 기존의 Root View Controller는 화면에서 사라짐(viewDidDisappear())
실습에서는 Root View Controller에 대한 생명주기 메소드의 로그만 확인하였는데, SeguePushViewController에도 똑같이 해당 메소드들을 override 해서 print문으로 로그를 출력하면 SeguePushVC의 메소드 호출 순서 또한 알 수 있다.
그런데 한 가지 중요한 점은, Root View Controller를 제외하고 다른 VC는 해당 VC가 호출되었을 때마다 viewDidLoad()를 호출한다는 점이다. 그 이유는 해당 VC의 viewDidDisappear() 호출을 통해 뷰가 사라지면 메모리에서도 해제가 되기 때문이다.
패스트캠퍼스 바로가기 : http://bit.ly/3Y34pE0
> 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[22일차] [LED 전광판 앱] LED 전광판 UI 그리기 part.1 (0) | 2023.03.13 |
---|---|
[21일차] [LED 전광판 앱] 화면간 데이터 전달하기 (0) | 2023.03.12 |
[19일차] [LED 전광판 앱] 화면 전환 구현 실습 (0) | 2023.03.10 |
[18일차] [LED 전광판 앱] 앱 화면 전환 개념 (0) | 2023.03.09 |
[17일차] [LED 전광판 앱] UINavigationController (0) | 2023.03.08 |