[TIL] UI작업은 왜 메인스레드인가?

숑이·2023년 7월 30일
1

iOS

목록 보기
15/26
post-thumbnail
post-custom-banner

이전에 GCD에 대해서 공부할 때 UI작업은 메인 스레드에서 담당한다... 라고 했었는데

그래서 왜 메인 스레드에서 UI를 담당하는거지? (메인 스레드가 아닌) 백그라운드 스레드에서도 UI를 그릴 수 있게하면 더 빠릿빠릿한거 아니야?

라는 물음에 확실한 대답을 할 수 없어서 이번에는 왜 메인 스레드에서 UI를 담당하는지 메인 스레드가 아닌 다른 스레드에서는 왜 UI작업을 하면 안되는지에 대해 알아보도록 하겠습니다.

이 부분에 대해 잘 정리되어있는 문서를 봤는데, 100% 이해되지는 않아서 깊게는 다뤄보지 않을 것이고, 대략적으로 어떤 느낌인지 알아가는 정도로만 봐주세요!

왜 메인스레드에서 UI를 담당하는가?

제 얕은 지식으로 간단한 생각을 얘기하자면,

UI의 안전성과 일관성을 유지하기 위해서입니다.
메인 스레드가 아닌 다른 여러 스레드에서 동시에 UI를 조작하면, UI 요소들이 충돌하거나 예상치 못한 동작을 할 수 있습니다.

라고 답할 수 있을 것 같습니다.

사실 대부분의 운영체제가 메인 스레드에서 UI를 담당하도록 하고 있습니다.
iOS도 마찬가지구요. 그래서 위 물음에 대한 답으로 이는 Apple이 그렇게 설계를 했기 때문이다... 라고 답해도 틀린 답은 아닙니다.

UI 업데이트를 반드시 Main Thread에서 해야하는 이유를 좀 더 자세히 알아보면 다음과 같습니다.

Cocoa Touch 앱에서 UIApplication의 인스턴스가 main thread에 붙기(attach) 때문.
UIApplication은 앱을 시작할 때 인스턴스화 되는 앱의 첫번째 부분인데,
얘는 앱의 run loop를 포함하여 main event loop를 설정하고 event처리를 시작합니다.
앱의 main event loop는 touch, gesture등의 모든 UI event를 수신합니다.

간단하게 얘기하면,

Main Event Loop는 터치, 제스처등 모든 UI Event를 받아 처리하는데, 이 Main Event Loop라는 것이 Main Thread에서 동작하기 때문에 UI를 업데이트 하기 위해서는 Main Thread에서 처리해야한다.

라는 것 입니다!

정리

  • UI 업데이트는 Main Thread에서 처리해야한다.
  • 메인 스레드가 아닌 다른 스레드에서 처리하는 경우 UI 요소들이 충돌하거나 예상치 못한 동작을 유발할 수 있다.
  • UI를 메인 스레드에서 담당하는 것은 Apple의 의도이다.
  • 앱이 실행되면, UI Event를 처리하는 Main Event Loop가 생성되는데, 이는 Main Thread에서 동작한다. 그렇기 때문에 UI는 Main Thread에서 처리해야한다.
profile
iOS앱 개발자가 될테야
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 30일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기