Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI 업데이트가 이루어지는 thread는 어떠한 thread이며, 다른 thread에서 UI 업데이트가 일어나게 되면 어떻게 되나요? #23

Open
youn9k opened this issue Jan 4, 2025 · 3 comments

Comments

@youn9k
Copy link
Collaborator

youn9k commented Jan 4, 2025

  • Main 스레드에서 작동한다
  • Main RunLoop에 맞게 UI 프레임워크가 동작되기 때문
  • 다른 스레드에서 동작하면 Main RunLoop와 사이클이 달라지며 오류를 발생
@hsw1920
Copy link
Owner

hsw1920 commented Jan 9, 2025

UI 업데이트는 반드시 메인 스레드에서 이루어져야 합니다.

그 이유는 UIKit의 모든 요소(View, frame, height 등)가 Thread-Safe하지 않기 때문입니다. 즉, UIKit 요소들은 여러 스레드에서 동시에 접근할 경우 예상치 못한 동작이나 데이터 무결성 문제가 발생할 수 있습니다.

만약 UIKit이 Thread-Safe하도록 설계된다면, 모든 작업에서 스레드 간 동기화를 보장해야 하므로, UI 상호작용에서의 지연, 버벅임, 화면 멈춤 등의 부작용이 생길 가능성이 높습니다.

이로 인해 Apple은 UI 작업을 메인 스레드에서 처리하도록 강제하며, 메인 스레드의 Main RunLoop를 디스플레이와 동기화시켜 UI 작업이 화면에 안전하게 반영되도록 설계했습니다.

또한, 메인 스레드의 Main Queue(직렬 큐)를 통해 모든 UI 작업이 순서대로 실행될 수 있도록 보장하고, Thread-Safe하지 않은 UI 변경사항을 빠르게 반영할 수 있습니다.

이러한 설계는 외부 인터럽트로 인해 Main RunLoop가 멈추는 일을 방지하며, UI 업데이트 관련 문제 발생 가능성을 최소화하기 위해 이루어졌습니다.

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 10, 2025

UI 업데이트가 일어나는 스레드는 메인 스레드입니다. 이러한 UI 업데이트를 메인 스레드에서 작업 하는 이유는 Main RunLoop가 동작하기 있기 때문입니다.

메인 스레드에서는 RunLoop가 일정한 주기를 유지하며 계속 동작하며 UI를 그리게 되는데 이때 이 View Drawing Cycle에 UI가 그려지는 시점을 일치시키기 위해 메인 스레드에서 동작합니다.

만약 이러한 UI 업데이트를 다른 스레드에서 한다면 해당 스레드의 RunLoop와 Main RunLoop의 타이밍이 달라지기에 UI를 그리는게 제각각이 됩니다.

또한 Main RunLoop 처럼 자동으로 지속적으로 돌고있는것 또한 아니기에 더욱 복잡해집니다.

추가적으로 UI를 위한 프레임워크의 요소들은 Thread-nonsafe한 요소입니다. 그래서 모든 스레드에서 접근이 가능한데, 만약 다른 스레드에서 UI 업데이트를 한다면 Race condition이 발생하고, 이를 safety하게 하기 위해 여러 장치를 사용한다면 오버헤드로 인해 유저가 버벅임을 느끼거나 멈춤 현상 같은 것을 쉽게 느끼게 됩니다.

@Kiyoung-Kim-57
Copy link
Collaborator

UI업데이트는 메인스레드에서 일어납니다.

UIKit은 Thread-safe하게 설계되지 않았습니다. UIKit이 Thread-safe하게 설게된다면 동기화 과정에서 오버헤드가 발생해 UI업데이트에 성능 문제가 생길 수 있기 때문입니다.
그래서 기본적으로 직렬 큐인 메인 스레드에서 작업해야 합니다.

또한 메인 스레드는 백그라운드 스레드와 다르게 외부 요인 영향이 적기 때문에 더 안전하게 UI를 업데이트 할 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants