-
안녕하십니까. 그린입니다🟢
이번 포스팅에서는 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로 타 스레드와 통신하는 경우
[정리 및 느낀점]
런루프가 지금 확실히 간단하게 정리되지는 않지만 정리해보자면 이렇다.
스레드와 함께 생성되는 런루프는 이벤트들에 대한 핸들링을 처리하는 추상화라고 볼 수 있다.
런루프에서 이벤트가 발생하면 이벤트 핸들링을 해주고 끝나면 대기 상태로 기다리는것이다.
그리고 다음 이벤트에 대해 모니터링을 해준다.
주의할 것은 런루프는 또한 완전하게 스레드 세이프 하지 않음으로 런루프 실행 중 다른 스레드를 호출하면 안된다.
[참고자료]
'iOS' 카테고리의 다른 글
Test Doubles - fake, stub, mock (0) 2021.07.22 ReactorKit으로 랜덤 통신 구현하기 (0) 2021.07.10 CI / CD (0) 2021.04.29 Machine Learning (0) 2021.04.20 Core Animation (0) 2021.04.01