iOS

Run Loop

GREEN.1229 2021. 6. 1. 19:17

안녕하십니까. 그린입니다🟢

이번 포스팅에서는 Run Loop(런루프)에 대해 학습해보겠습니다🧑🏻‍💻

 

런루프.. 어디서 많이 보고 런루프의 이벤트 처리 그림도 봤었는데 막상 생각해보니 제대로 이해하고 있지 않더라구요.

그래서 이번 기회에 한번 파해쳐보겠습니다!

Run Loop

 : 작업 스케쥴링과 전달된 이벤트를 처리하는 이벤트 처리 루프

 : 런루프는 유저가 이벤트를 일으키고 그 이벤트들을 처리하는 프로세스

 : 대표적으로 UIApplication이 메인 런루프를 뷰의 이벤트 및 업데이트를 처리해줄 때 활용

 : 메인 런루프는 뷰와 관련 있기때문에 뷰하면 어디다..!? 메인 스레드에서 동작

 : 런루프의 목적은 스레드에 작업이 있으면 하게하고 없으면 쉬도록 하는것에서 나옴

 

아래는 메인 스레드의 런루프 과정

 동작을 살펴보면,

 -. 유저 이벤트 발생 (터치, 줌)

 -. 이벤트 생성 (시스템 영역)

 -. UIKit 프레임워크를 통해 Port로 이벤트 앱 전달

 -. 큐의 모양으로 메인 런루프에 순차적으로 FIFO 방식으로 하나씩 전달

 -. UIApplication 객체에서 어떤 동작이 실행되는지 결정

Run Loop (2)

 - 앱의 각 스레드 객체에는 자동으로 생성된 런루프 객체가 존재

 - 런루프 접근 시 current 메서드로 접근

Run Loop 구조

 -. Input source: 핸들러에 비동기 이벤트 전달하고 runUntilDate 메서드가 종료

 -. Timer source:  핸들러에 이벤트 전달하지만 런 루프를 종료하진 않음

 -. 런루프는 동작에 대해 노티피케이션을 생성

 -. 등록된 런루프 옵저버를 통해 알림을 수신하고 추가 처리를 위해 스레드에 구현하는것이 가능

Run Loop 사용

 -. 앱에 대해 메인 외 다른 스레드를 생성할 때 런루프 명시를 해야함 (메인 스레드는 자동으로 런루프를 실행)

 -. 스레드에서 타이머를 사용하는경우

 -. Port / Custom input source로 타 스레드와 통신하는 경우 

[정리 및 느낀점]

런루프가 지금 확실히 간단하게 정리되지는 않지만 정리해보자면 이렇다.

스레드와 함께 생성되는 런루프는 이벤트들에 대한 핸들링을 처리하는 추상화라고 볼 수 있다.

런루프에서 이벤트가 발생하면 이벤트 핸들링을 해주고 끝나면 대기 상태로 기다리는것이다.

그리고 다음 이벤트에 대해 모니터링을 해준다.

주의할 것은 런루프는 또한 완전하게 스레드 세이프 하지 않음으로 런루프 실행 중 다른 스레드를 호출하면 안된다.

[참고자료]

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html