Xcode가 넣으라고 해서 넣다가 문득 생각해보니 몰라서 알아보았다.
예를 들어 생각해보자. UITableView의 셀이 백그라운드 스레드에서 제거되었는데 다른 백그라운드 스레드가 해당 셀에 접근하려고하면 어떻게될까? 크래시가 발생할 것이다. 또 백그라운드 스레드의 Runloop에 특정 뷰에 대한 제거가 진행중에 있는데, 사용자가 해당 뷰를 탭하면 그 응답을 어떻게 처리해야할까? 어떤 스레드에서 해당 응답을 처리해야할지조차 애매하다.
View Drawing Cycle을 생각해보면 하나의 Runloop에서 이를 확인하고 관리하게 된다. 하지만 만약 각 스레드의 Runloop에서 View의 life cycle을 관리하게 되면 화면의 UI가 변경되었을 때 모든 변경사항을 화면에 존재하는 여러 View들이 확인할 수 없게 된다. 따라서 View가 깨질 것이다.
iOS는 그림을 표현할 때 특정한 랜더링 프로세스(코어애니메이션 -> 렌더서버 -> GPU -> 표시)를 거치는데, 여러 스레드에서 각 뷰의 변경사항을 GPU로 보내면 각 정보를 해석하기 위해 많은 오버헤드가 발생할 수 있다.
페이스북에서 비동기적으로 UI를 업데이트하는 프레임워크(AsyncDisplayKit(Texture), ComponentKit)을 개발했지만, 이 역시 결과적으로는 메인 스레드에서 변경사항이 적용되도록 하고 있다.