여러 프로젝트를 통해 main
에서 UI작업을 해야한다는 것은 체득되었다.
다시 말하자면,
main
스레드에서 작업해야한다.main
스레드에 할당하지 않으면 에러가 발생한다.일단 생각을 해본 결과 아래의 내용처럼 길어졌다.
UIKit은 UI를 구성하는 구성 요소들의 집합이다.
즉, 화면에 즉각적으로 표현이 되는 요소들이다.
그러나 이 UIKit 대부분의 요소들은 Thread Unsafe
한 성질을 가지고 있다.
여러 스레드에서 접근이 가능한 것이다.
Race Condiotion 이 발생할 수 있다.
우리가 보는 화면을 여러 스레드에서 막 접근하여 바꿀 수 있게 된다.
예를 들어, 버튼의 모양을 바꾸는 일, 버튼의 색을 바꾸는 일이 충돌하여 의도대로 동작하게 된다.
즉, Thread Unsafe한 UIKit 작업을 Serial Queue인 Main Thread로 가져와서 작업을 하는 것!
UI 작업을 꼭 Main 스레드에서 작업해야하는 이유는 메인 스레드에는 Main RunLoop
가 동작하고 있기 때문이다.
Main 스레드에서는 RunLoop가 일정한 주기를 유지하며 계속 동작하고 있고, 이 주기에 맞춰서 사용자의 입력을 받아 UI를 그리게 된다. (이러한 주기를 View Drawing Cycle
이라고 한다.)
하지만 모든 스레드는 각자의 RunLoop를 가질 수 있다.
위에서 말한대로 모든 스레드의 RunLoop에 따라 각자가 UI를 그리게 된다면 UI그리는 시점이 모두 제각각이게 된다.
Race Condition도 발생하고 비효율적이고 관리가 되지 않기 때문에 Main RunLoop로 고정을 한 것이 아닐까 싶다.
📌 그러면 어떤 문제에서 오버헤드와 복잡성이 증가할까?
일단 ThreadSafe하게 만들기 위해서는 공유자원 접근에 대한 Locking이 필요하다.
(Locking을 사용하면 동시적으로 공유자원에 접근하는 코드 영역인 크리티컬섹션에 접근하는 스레드의 수를 제한 할 수 있게 된다.)
여기까지 대략 알고있는 내용이고,
하지만 Locking을 사용하는 것 자체가 추가적인 오버헤드가 발생하고 또 다른 레이스 컨디션이 발생할수 있다고한다..(Locking을 쓰면 레이스 컨디션은 발생을 안하지 않나..)
물론 DeadLock이나 Starvation 같은 상황은 일어날 것 같다.
쨋든 개발자가 개발을 할때 있어서 공수비용도 많이들어가고 설계도 힘들어지고, DeadLock, Starvation같은 상황 때문에 Unsafe하게 설계를 하지 않았을까 생각이든다..