상세 컨텐츠

본문 제목

왜 IOS UI작업은 Main Thread가 해야하는가?

IOS

by 앱등개발자IOS 2022. 5. 16. 19:21

본문

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별로 처리할지 정하기 어려워지기 때문입니다.

관련글 더보기