본문 바로가기

iOS

[iOS] RunLoop

최근 레이아웃 애니메이션을 공부하다가 update cycle이 RunLoop안에 있다고 해서 RunLoop가 뭔지 공부해봅시다.

 

Developer Documentation에 뜨는군요!

 

입력 소스들을 관리하는 객체들에 대한 프로그래밍 인터페이스입니다.

 

개요

RunLoop는 윈도우의 키보드, 마우스처리와 같은 소스를 입력받아 처리하는 오브젝트입니다. 또한 Timer events도 처리합니다.

MainThread에서는 자동으로 만들어지나 프로그래머가 만든 Thread에서는 직접 관리해줘야 합니다.

Timer는 인풋은 아니지만 특별히 관리합니다. + current() 메서드로 불러서 쓸 수 있습니다..

 

경고

스레드 세이프하지 않다. current 메서드를 이용해서만 쓰세요! 다른 스레드에서 쓰면 원치않은 결과를 야기할 수 있습니다.

 

 

추가적인 정보 

- RunLoop 객체는 소켓, 파일, 키보드 마우스 등의 입력 소스를 처리하는 이벤트 처리 루프로 쓰레드가 일해야 할 때는 일하고, 일이 없으면 쉬도록 하는 목적으로 고안되었습니다.

- 메인 스레드는 자동으로 RunLoop 설정하고 실행 시켜주는데 프로그래머가 따로 생성한 스레드에서는 프로그래머가 직접 설정하고 실행해주어야 합니다.

 

 

RunLoop는 2가지의 Event Source를 수신

 

- Input Source

다른 Thread나 Application으로부터 온 비동기 이벤트를 전달합니다.

 

- Timer

예약 된 시간 또는 반복 간격으로 발생하는 동기 이벤트를 전달합니다.

 

사진에서 보면 RunLoop는  왼쪽 Thread에서 Start -> End로 한번 실행을 하면 한번 실행한 동안 이벤트를 받고 이에 대한 핸들러로 수행하는 객체입니다.

 

RunLoop라고해서 계속 반복한다고 생각할 수 있지만 RunLoop는 내부적으로 반복 실행을 하지 않는다. 한번 Event Source를 읽고 전달하는 실행이 끝나면 그다로 대기를 한다. (일 없으면 쉬도록 고안됬다는게 대기를 말하는 거군요.) 그래서 프로그래머가 명시적으로 반복문을 통해 RunLoop를 실행시켜 주어야 합니다. 

 

RunLoop를 사용해야하는 경우

- Input Source를 통해 다른 Thread와 통신하는 경우

- Timer를 사용하는 경우

- Perform Selector Source를 사용해야 하는 경우

- 주기적인 일을 계속 수행해야하는 경우

 

 

정리하자면 

Thread가 수행해야 할 이벤트들을 핸들링하여 적절히 수행을 요청하고 이벤트 처리가 종료되면 대기 상태가되어 다음 이벤트에 대한 모니터링을 해줍니다.! 이러한 이벤트 들은 evwnt queue에 추가하고 하나씩 애플리케이션의 적절한 핸들러에게 전달!