개요
어제 면접을 봤는데, 기초적인 부분에서 내가 알고 있던것과 다른 답변을 주신 면접관분이 있었다.
바로바로 Life Cycle. onAppear는 언제 호출되는가.
사실 SwiftUI는 라이프사이클 함수라고 해봤자 onAppear, onChange, onDisappear이 전부다.
굳이 더 디테일하게 들어가면.... init, deinit정도?
UIKit에서 뷰컨트롤러(View Controller)의 라이프사이클과 정말 비교되는 심플한 형태이다. 나타나고, 바뀌고, 사라지고.
viewDidLoad, viewWillAppear, viewDidAppear 등등등 총 7가지의 생명주기 메소드가 존재한다.
물론 이 메소드들도 네이밍이 너무 명확하기 때문에 한 번만 주의깊게 봐두면 추후에 딱히 헷갈리지 않긴 한다.
어쨌든, 우리는 애플이 밀고 있고 사실상 표준이 된 SwiftUI에 대해 좀 더 이야기를 해보도록 하자.
onAppear
그래서 면접 때 나와 의견이 갈렸던 부분은 뷰가 화면에 렌더링 된 후에 onAppear가 호출되느냐, 렌더링 전에 onAppear 블록 호출이 종료되느냐였다.
일단 나는 렌더링 전에 블록 호출이 종료된다고 알고 있었다.
이름 명료하다면서 왜 그딴 생각을 하고 있었냐. 말이 다르지 않냐
자 들어보시라.
여러분은 onAppear가 호출되는 시점이 언제라고 생각하는가. 다음 그림을 토대로 한 번 보자.

여러분은 몇 번에 전재산을 걸겠는가?
.
.
.
.
.
.
.
.
...
.
.
..
.
.
.
.
.
네이밍대로만 보면 7번이 정답이다. 왜냐하면 화면에 우리가 볼 수 있는 무언가가 나타났기 때문이다.
하지만 정답은 5번이다. 이건 애플 공식 다큐먼트에도 있는 증명할 수 있는 이야기이다.

action함수는 처음 렌더된 프레임이 화면에 나타나기 전에 완료된다.
한마디로 action callback에 3초이상 메인쓰레드를 차지하는 코드 블록을 넣으면 3초동안 뷰는 화면에 보이지 않는 것이다.
이 부분은 내가 렌더링이란 단어에 대해 조금 오해해서 생긴 문제였던 것 같다.
내가 생각했던 렌더링이라는 것은 화면에 그래픽 쪼가리들이 따다다다다다다 하고 그림을 그리는 작업을 끝내는 것 까지를 생각하고 있었다.
하지만 렌더링 자체는 gpu단에서 이미 완료가 된 상태이고, 화면에 drawing을 하는 건 렌더링의 영역을 벗어난 거였다.
결국 나는 위 그림에서 draw-ing과 render-ing이 분리된 상태가 아니라 하나의 상태로 봤던 것이다.
그러니까 이게 되게 어중간하게 알고 있었다는 얘기다. 하 슬프네
자 그러면 이 글을 본 사람들은 어떻게 해야된다? 이거 명확하게 알고 넘어가도록 합시다.
task
그러면 이번에는 태스크 모디파이어를 보자. 이 모디파이어는 다들 알다싶이 비동기 작업을 수행할 수 있는 모디파이어이다.
기존에 onAppear을 사용할 때는, 비동기 코드를 집어넣으려면 Task블록으로 래핑한 뒤에 진행했어야한다. 그리고 그 코드 블락이 끝나기 전에 뷰가 사라지면? ^^ 단순히 숫자계산만 하는 코드라면 상관없지만, 어떤 무거운 객체를 참조하고 있다면 바로 메모릭
이 부분도 사실 면접보면서 좀 간과하고 있어서 대답을 못했던 부분이다. 꼭 기억해둡시다.
근데 이제 task modifier를 통해 비동기 작업을 수행하면 그런 걱정은 덜어두어도 된다.
SwiftUI가 뷰 사라지는거에 맞춰서 task의 task도 취소를 알아서 해준다고 한다.
결론
지금껏 개발하면서 그래도 많이 배웠다고 생각했다. 실제로 많이 배우긴했다. 근데 이것들이 어설프게 알고 있으니까 즉각적으로 피드백이 안된다.
물론 모르면 다시 배우면 되니까 문제 될 건 없다.
다들 모른다고 좌절하지 않기(내가 어제 엄청나게 좌절했었다. 근데 그거 쓸모없는거 알죠?)
'iOS' 카테고리의 다른 글
| [Swift] Supabase에서 받아온 created_at이 디코딩 되지 않을 때 (0) | 2024.10.17 |
|---|---|
| [Swift] 1인 앱 개발로 사용할 기술 스택 및 서비스 (4) | 2024.10.02 |
| [SwiftUI] ViewModifier? Custom ViewModifier 만들기 (1) | 2024.09.11 |
| [SwiftUI] GridView 만들기 (1) | 2024.09.10 |
| [SwiftUI] SafeArea height 구하기 (0) | 2024.09.09 |