Understanding view -controller life cycle

hk k·2022년 5월 16일
0

iOS

목록 보기
1/3
post-thumbnail

life cycle이 중요한 이유

대부분의 어플리케이션은 단일 화면보다는 여러 개의 화면들로 구성된다.
때문에 그만큼 여러 view controller가 존재하게 되어 load/unload되는 횟수가 많아지기 때문에 상황 변화에 따라 UI의 변화, 데이터 변화를 잘 다룰 수 있어야하기 때문이다.

view controller의 메소드

view controller는 상태 변화에 따라 각기 다른 메소드들을 호출하게 된다. view controller는 다음과 같이 4가지 상태로 나눌 수 있다.

Appearing : 뷰 컨트롤러가 스크린에 등장하기 시작한 순간부터 등장을 완료하기 직전까지의 상태로 Disappearing 상태인 다른 뷰 컨트롤러와 교차하기도 한다.

Appeared : 뷰 컨트롤러가 스크린 전체에 완전히 등장한 상태이다.

Disappearing : 뷰 컨트롤러가 스크린에서 가려지기 시작해서 완전히 가려지기 직전까지의 상태로 Appearing 상태인 다른 뷰 컨트롤러와 교차하기도 한다.

Disappeared : 뷰 컨트롤러가 스크린에서 완전히 가려졌거나 혹은 퇴장한 상태를 나타낸다.

각각의 상태에 따라 view controller가 호출하는 메소드가 달라지게 되는 것이다.

1. viewDidLoad()

위 메소드들에 앞서 viewDidLoad() 메소드가 제일 먼저 실행된다. 이는 view가 생성될 때 한번만 실행되고 view의 컨트롤러가 메모리에 load된 후에 호출된다.

view의 로딩이 완료된 후 시스템에 의해 자동으로 호출된다. 따라서 일반적으로 리소스를 초기화하거나 초기화면을 구성할 때 사용하는 메소드이다.

2. viewWillAppear()

함수명 그대로 view가 화면에 나타날 것이라는 뜻으로 view가 나타나기 직전에 호출된다. 화면이 등장할 때마다 데이터를 갱신해주는 등의 과정은 이 메소드를 통해 처리해주면 된다. viewDidLoad() 메소드와의 차이는 viewDidLoad()는 view가 생성될 때 한번만 호출되고 생성된 view가 또 화면에 나타나게 될 때는 viewWillAppear() 메소드만 호출되게 된다.

예를 들어, navigation controller를 사용하는 상황에서 2개의 view가 있다고 가정할 때 처음에 2개의 view가 생성될 때는 모두 viewDidLoad()를 호출하게 되지만 이후에 서로 navigation을 사용하여 view를 전환하게 되면 viewWillAppear() 메소드만 호출되고 viewDidLoad()는 호출되지 않는다.

따라서 초기화 과정은 viewDidLoad() 에서 처리하되, 다른 view로 갔다가 돌아오는 과정에서 처리해주고 싶은 것이 있다면 viewWillAppear()에서 처리해주면 된다.

3. viewDidAppear()

함수명 그대로 view가 화면에 나타난 직후에 실행되는 메소드이다. view가 나타난 후에 보여줄 애니메이션 등의 처리를 이 메소드에서 해주게 된다.

4. viewWillDisappear()

함수명 그대로 view가 화면에서 사라질 것이라는 메소드이다. 사라지기 직전에 처리해야할 것을 이 메소드에서 처리하게 된다.

5. viewDidDisappear()

함수명 그대로 view가 화면에서 사라진 직후에 실행되는 메소드이다. viewDidDisappear()가 호출됐다는 것은 view가 사라졌다는 것을 의미한다. 스크린으로부터 view가 퇴장하는 도중에 사용자의 액션으로 인해 재등장하는 경우에는 퇴장을 시작했으므로 viewWillDisappear()는 호출되지만 완전히 퇴장한 것은 아니므로 이 메소드는 호출되지 않는다. 또한 재등장 하였기 때문에 viewWillAppear()와 viewDidAppear() 메소드는 호출되게 된다.







life cycle를 잘 이해하고, 상태 변화시 호출되는 메소드들을 잘 파악해 놓는다면

특정화면에 진입했을 때 로그인이나 권한 여부를 체크하고 싶다면?

화면이 표시될 때마다 최신 데이터를 업데이트해주고 싶다면?

메모리 부족 시 가용 메모리를 확보하는 코드를 작성하고 싶은데 메모리가 부족한지 체크하고 싶다면?

화면이 완전히 표시될 때 알림창으로 공지를 띄우고 싶다면?

사용자가 저장 버튼을 누르지 않아도 지금 화면 상태를 다음에 유지하고 싶다면?


등등 여러 문제를 쉽게 해결할 수 있다.



예제를 통해서 위 메소드들을 확인해보면

간단한 탭바 컨트롤러를 생성해서 2개의 view를 생성해보았다.

어플리케이션을 실행하면 첫 화면이 생성되고 viewDidLoad(), viewWillAppear(), viewDidAppear() 메소드가 호출된다.

두 번째 화면을 탭하게 되면 두 번째 view의 viewDidLoad()가 호출되고 viewWillAppear()가 호출된 후 viewDidAppear()가 호출되기 전 첫 번째 view의 viewWillDisappear()와 viewDidDisappear()가 호출된 후에 두 번째 view의 viewDidAppear()가 마지막으로 호출된다.

그 후에 다시 첫 번째 화면을 탭하게 되면 첫 번째 view의 viewDidLoad()는 호출되지 않는다는 것을 확인할 수 있다.

profile
성장하는 괴물

0개의 댓글