Search
Duplicate

왜 UI를 메인 쓰레드에서 업데이트 해야할까?

생성일
2023/07/12 04:32
태그
Swift

왜 UI를 메인 쓰레드에서 업데이트 해야할까?

1.
UIKit의 모든 속성을 Thread-safe 하게 설계하면, 느려짐과 같은 성능 저하가 발생할 수 있기 때문에 그렇게 설계할 수 없다. (Thread-safe 하지 않게 설계한 것은 애플의 의도다!)
2.
메인 런루프(Runloop)가 뷰의 업데이트를 관리하는 View Drawing Cycle을 통해 뷰를 동시에 업데이트 하는 그런 설계를 통해 동작하고 있는데, (메인 쓰레드가 아닌)백그라운드 쓰레드가 각자의 런루프로 그런 동작을 하게 되었을 때, 뷰가 제멋대로 동작할 수 있다.
a.
예를들어, 기기를 회전 했을 때, 뷰의 레이아웃이 동시에 재배치 되는 그런 동작을 못하게 될 수도 있다.
3.
iOS가 그림을 그리는 렌더링 프로세스(코어 애니메이션 → 랜더서버 → GPU → 표시)가 있는데, 여러 쓰레드에서 각자의 뷰의 변경사항 GPU로 보내면 GPU는 각각의 정보를 다 해석해야하니 느려지거나, 비효율적이 될 수 있다.
4.
Texture나 ComponentKit 라는 페이스북에서 개발한 비동기적 UI 프레임워크가 있긴 하지만, 그조차도 View Drawing Cycle이 유사한 방식으로 적절한 타이밍에 메인 쓰레드에서 동시에 업데이트 하도록 하고 있다.
→ iOS 뿐만 아니라, 다른 OS에서도 위와 유사한 이유들 때문에 UI 업데이트는 메인 쓰레드에서 이루어지도록 설계되어져 있다.