Run Loop
View Drawing Cycle에 대해서 정리하고 싶었는데 그 전에 iOS의 Run loop에 대해 먼저 짚고 넘어가야 할 거 같아서 개념에 대해서만 간략히 정리 해볼게요 :)
Run Loop
- Run loop는 파일, 키보드, 마우스 등의 입력 소스를 처리하는 이벤트 처리 루프예요.
- Run loop의 관점에서는 특수한 경우지만 Timer의 이벤트 또한 처리해요.
- 특정 이벤트가 발생하면 쓰레드가 일해야 할 때는 일하고, 일이 없으면 쉬도록 하기 위해 Apple에서 만든 쓰레드 관리 루프예요.
Apple 공식 문서
특징*
-
쓰레드는 모두 각각의 Run loop를 가지고 있어요. 1-1. 일해야 할 때는 일하게 하고, 일이 없으면 쉬게 해야하니까 1-2. 쓰레드가 입력받는 이벤트에 대한 응답으로 이벤트 핸들러를 실행하는데 사용해야하니까
-
쓰레드가 생성될 때 Run loop가 자동적으로 생성돼요.
-
생성만 자동으로 될 뿐 실행은 자동으로 되지 않기 때문에 쓰레드 내부에서 프로그래머가 직접 while, for문을 통해 명시적으로 반복 실행 시켜야 해요.
-
Main Run loop만은 예외로 UIApplication 객체가 앱이 실행될 때 Main Run Loop를 자동으로 설정하고 실행해요. 4-1. UIApplication 객체 생성 4-2. @UIApplication 또는 @Main 어노테이션이 있는 Class를 찾아서 AppDelegate 객체 생성 4-3. Main Event Loop(사용자의 Action을 받는 loop)를 실행
작동 원리
- Input Source: 다른 쓰레드나 다른 응용 프로그램으로부터 온 비동기 이벤트를 전달
- Timer Source: 예정된 시간 또는 반복되는 간격으로 발생하는 동기 이벤트를 전달
위에 runUntilDate: customSrc: mySelector: timerFired:는 현재 네이밍이 바뀌거나 Deprecated 되었으나 메서드의 네임이에요!
RunLoop 객체에 runUntilDate(_:) 메서드를 실행하면 지정된 날짜까지 루프를 실행하고 그 기간동안 부착된 Event Sources(Input, Timer)를 처리해요.
쓰레드에 loop가 한 바퀴를 도는 동안 Event Sources를 모아놓았다가 다시 한 바퀴 돌며 모아 놓은 Event Sources를 처리하는 방식으로 보여요 :)
Run Loop 사용 시점
쓰레드를 직접 만들고나서
- Input Source를 통해 다른 쓰레드와 통신하는 경우
- Timer를 사용해야 하는 경우
- perform Selector Source를 사용해야 하는 경우
- 주기적인 일을 계속 수행해야 하는 경우
Leave a comment