[iOS] Main Thread 에서 UI를 업데이트 해줘야 하는 이유

강치우·2024년 1월 9일
0

수입푸드

목록 보기
4/13

Main Thread 에서 UI를 업데이트 해줘야만 하는 이유

Thread safe하지 않기 때문이다.
이는 UI 요소가 오직 메인 스레드에서만 안전하게 접근되고 수정될 수 있음을 의미함

Thread safeRace Condition
Thread safe 하다는것은 Race Condition 이 발생하지 않는다는뜻이다.
RaceCondition 이란, 한 값에 여러 스레드가 동시에 접근함을 뜻한다.

UI작업을 꼭 메인 스레드에서 작업해야하는 이유는 메인 스레드에는 Main RunLoop가 동작하고 있기 때문이다.

메인 스레드에서는 RunLoop가 일정한 주기를 유지하며 계속 동작하고 있다.

이 주기에 맞추어서 사용자의 입력을 받아서 UI를 그리게 된다.

이러한 주기를 View Drawing Cycle이라고 한다.

모든 스레드의 RunLoop에 따라 각자가 UI를 그리게 된다면 UI가 그려지는 시점이 모두 제각각이 되면, 그렇게 되면 비효율적일 뿐더러 Race Condition이 발생하게 된다.

즉 어느 스레드에서 언제 업데이트 할지도 모르고 동일한 text값이나 뷰에 대해서 서로 동시에 접근하게 되면 어떻게 변화시켜야하는지에 대해서 race condition이 발생하기 때문이다.

따라서 Main에서만 업데이트 해주어야한다.


RunLoop

런루프는 두개의 일을 한다.

  • 특정 이벤트가 왔을 때 쓰레드가 일해야 할 때는 일하고, 일이 없으면 쉬도록하기 위해 애플에서 만든 쓰레드관리 Loop
  • 이벤트가 들어오면 이벤트 헨들러를 실행하는데, 이벤트 핸들러를 언제 실행하지 결정해주는 루프를 의미

Run Loop 는 두 가지의 소스를 수신

  • input source: 한 루프 한바퀴를 도는 동안, 다른 스레드나 다른 응용프로그램의 비동기 이벤트가 수신된 것을 확인하고, 이벤트 핸들러 수행
  • timer source: 한 루프 한바퀴를 도는 동안, 예정된 시간이나 반복되는 간격으로 발생하는 동기 이벤트를 수신된 것을 확인하고, 이벤트 핸들러 수행

런루프는 직접 실행해야한다.

스레드를 생성할때 자동으로 생성되지 않기 때문에, Thread.current를 하게되면 런루프가 존재하면 가져오고, 없음 생성하게된다.

하지만 위에서 설명했듯, 런루프는 한번의 실행동안, 이벤트 input과 timer를 확인하고 해당 이벤트를 수행하게 된다.

이를 프로그래머가 명시적으로 실행해줘야한다.

  • 즉 런루프란, 이벤트를 받고 이를 언제 실행시킬지 정해주는 루프를 의미한다.
  • Main Thread는 애플리케이션이 실행될 때 프레임워크 차원에서 자동으로 RunLoop를 설정하고 실행

정리하며

Main Thread 에서 UI를 업데이트 해줘야만 하는 이유는 Thread safe 하지 않고, 메인 스레드에는 Main RunLoop가 동작하고 있기 때문이다.

profile
자허블을 좀 더 좋아하긴 합니다.

0개의 댓글