URLSession, Alamofire 등 http 통신을 구현하다보면, 통신 후 UI업데이트를 위한 코드는 dispatchQueue.main.async{}와 같은 블럭 안에 작성했던 경험이 있었습니다.
깜빡하고 UI업데이트 코드를 fetchData()함수에 main스레드에서 실행하라는 코드 없이 작성하였을 때,
앱이 그냥 죽어버리는 경험도 다들 겪어보셨을텐데요,
그냥 그런가보다~ 하다가, 조금이나마 검색을 해서 main스레드만이 UI작업을 담당해야하는 이유를 알아보게 되었습니다.~
짧게나마 안드로이드를 다뤘을 때도 UI는 메인 스레드가 담당했던 기억이있었는데요
IOS에서 왜 UI작업은 Main스레드가 담당하는 것일까요??
먼저 공식문서에는 UIKIt에 대하여 다음과 같은 설명이 나와있습니다.
UIKit
UIKit클래스는 MainThread 혹은 메인 dispatchQueue에서만 사용하라는 것인데요,
애플에서 UIKit을 Thread-Safety하게 설계하지 않은 것은, 그렇게 하는 것이 성능면에서 비효율적이기 때문이라고 합니다.
1. 첫 번째는 IOS가 화면을 그리는 process와 관련이 있습니다
ios는 CoreAnimation -> RenderServer -> GPU -> 화면 의 process를 거쳐 화면을 그리는데요,
여러 Thread에서 각자 view에 대한 변경사항을 GPU로 보내면, 여기저기서 오는 정보들을 다 해석해야하니
UI 갱신이 느려지고 비효율적이게 될 것입니다.
2. UIKit의 속성을 async하게 하였다면, view의 변경사항들을 동시에 처리할지, 그 때 그 때 thread별로 처리할지 정하기 어려워지기 때문입니다.
(IOS) 초기화/갱신 류의 작업은 viewWillAppear와 viewDidLoad 중 어디에서 할까?? (0) | 2022.05.16 |
---|---|
GCD(Grand Central Dispatch)를 이용한 MultiThread 프로그래밍 (0) | 2022.05.16 |