swift

Main event loop와 Update cycle

kimyounggyun 2023. 1. 31. 21:12

Main event loop

메인 이벤트 루프(Main event loop)는 메인 스레드의 런 루프이다. 메인 이벤트 루프는 애플리케이션이 시작될 때 생성된 애플리케이션(UIApplication) 객체에 의해 자동으로 생성되고 실행된다. 런 루프는 두 가지 종류의 입력 이벤트를 받을 수 있는데 메인 이벤트 루프는 유저로부터 입력 소스(Input Source) 이벤트를 받는다. 메인 이벤트 루프는 다른 런 루프와 다르게 멈추지 않는다. 따라서 입력 이벤트 핸들링과 애플리케이션의 상태와 뷰 업데이트를 계속해서 처리한다. 

운영체제(iOS)는 유저로부터 입력받은 저 수준의 이벤트를 도착한 순서대로 이벤트 큐(Event Queue)에 넣는다. 애플리케이션 객체는 이벤트 큐에서 이벤트를 한 개 뽑아 이벤트가 발생한 윈도우 객체(UIWindow)에 전달한다. 윈도우 객체는 전달받은 이벤트를 이벤트가 발생한 뷰에 보내 이벤트 처리를 위임한다. 만약 초기 뷰가 이벤트를 핸들링하지 않으면 responder chain을 통해 부모 뷰로 이벤트를 계속해서 넘겨 이벤트를 수행할 뷰를 찾는다. 만약 이벤트가 윈도우 객체에 다시 도착하면 이벤트를 버린다. 이벤트를 처리하는 뷰는 이벤트를 처리하는 과정에서 애플리케이션의 상태와 뷰를 업데이트 한다. 이벤트 처리가 끝나면 뷰는 다시 애플리케이션 객체에 컨트롤을 반납한다.

Update cycle

기존 60Hz 주사율에서 최근 120Hz 가변 주사율까지 지원하는 iOS는 \(\frac{1}{120}\)~\(\frac{1}{60}\)초에 마다 화면을 갱신한다. 뷰가 이벤트를 처리하는 과정에서 뷰의 변화가 생기면 표시가 되어 다음 업데이트 사이클에 업데이트된다. 업데이트 사이클은 뷰가 이벤트를 처리하고 다시 애플리케이션 객체에 컨트롤을 반납하는 지점이다. 뷰가 이벤트를 처리하는 과정에서 뷰에 변화가 생겼다면 이 지점에서 뷰의 제약(constraints), 레이아웃(layout), 디스플레이(display)를 갱신한다. 

참고