GCD에 철칙, UI업데이트는 반드시 main에서 해야 한다

하지만 왜?

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

앱의 UI event는 UIApplication → UIwindow→UIViewcontroller→UIView→SubViews와 같이 chain으로 연결되어 있는데 이렇게 연결되어 있다보니 UIApplication이 어테치된 main에서 동작해야 한다고 함.

왜 main.sync는 안될까?

일단 main queue는 Serial queue입니다. 한 task가 끝나야 다음 task를 실행함 sync는 큐의 작업이 끝날때까지 그 코드에 머물러 있음, 즉 큐를 block하고 우리가 큐에 넣은 작업이 완료될때까지 wait상태로 기다리게 됨.

만약 main queue에서 sync를 호출하게 되면 우리가 넣은 task가 끝날때까지 main queue는 block상태에 돌입하게 됩니다. 이렇게 되면 main queue에더 동작하는 UI관련 작업들이 버벅거리게 된다던가, 최악의 경우 Deadlock에 빠지게 되어 앱이 죽게 됨