[iOS] Run Loop

mmim·2022년 6월 15일
0

Run Loop?

우선 공식 문서를 먼저 살펴보는게 국룰

공식문서에서는 간단하게 아래와 같이 RunLoop를 설명하고 있다.

1️⃣ RunLoop는 작업(입력소스)을 예약하고 이벤트를 처리하는 루프
2️⃣ RunLoop의 목적은 할 일이 있을 때 스레드를 계속 사용중으로 유지하고 작업이 없을 때 스레드를 절전 상태로 유지하는 것
3️⃣ 대표적으로 UIApplication이 메인 런루프를 뷰의 이벤트 및 업데이트를 처리해줄 때 활용
4️⃣ Main Run Lopp는 View와 연관이 깊고, Main Thred에서 동작

🧐 여기서 주의해야 하는 점이
스레드는 모두 각자의 RunLoop을 갖지만
RunLoop 관리는 완전히 자동적인 것은 아님❌

때문에 개발자는 적절한 시간에 런루프를 시작하고 들어오는 이벤트에 응답하도록 스레드의 코드를 설계해야 한다.
(하지만 MainRunLoop는 자동으로 설정하고 실행한다.)


Run Loop의 원리

RunLoop는 스레드가 입력받은 이벤트에 대한 응답으로 이벤트 핸들러를 실행하는 데 사용하는 루프

RunLoop는 2가지 Event Source를 수신한다.(Input Source / Timer)
1️⃣ Input Source

  • 다른 스레드나 Application으로부터 온 비동기 이벤트를 전달
  • runUntilDate 메서드가 종료
    2️⃣ Timer
  • 예약, 일정한 간격의 반복 발생하는 동기 이벤트를 전달
  • 하지만 RunLoop를 종료하진 않음

만약 스레드를 생성하고, 이 스레드가 Input Source, Timer를 처리해야한다면 RunLoop를 직접 얻어서 실행해줘야함
이 때 내가 생성한 스레드에 대한 RunLoop를 얻기 위해선 class RunLoopcurrent 프로퍼티를 이용

class var current: RunLoop { get }

let loop = RunLoop.current

하지만 이렇게 내가 원하는 RunLoop를 얻었다고 해서 Input Source, Timer를 처리해주진 않는다.
run을 통해 직접 실행시켜줘야한다.(앞서 말한것처럼 이건 개발자의 몫)

또한, RunLoop는 단순히 이벤트를 처리하는 것 뿐 아니라, 이벤트에 대해 Notification을 발생시킴
-> 등록된 RunLoop 옵저버를 통해 알림을 수신하고 추가 처리를 위해 스레드에 구현하는 것이 가능
-> 이에 따른 추가적인 처리 가능

loop라고 해서 자동으로 돌거나 계속도는 개념이 아님❌
만약 한번 Event Source를 읽고 전달하는 실행이 끝나면, loop는 대기 상태
때문에 Event를 받지 않음
따라서 while, for 코드를 이용해 런루프를 구동하는 루프를 제공해야함.

Run Loop 실행하기

Run Loop 실행을 이야기하기 앞서...

지금껏 Main Run Loop 같은 경우 run을 해주지 않았음에도 자동으로 실행됐었는데? 🤔라는 의문이 생긴다.
이것은 Main Thread는 애플리케이션이 실행될 때 프레임워크 차원에서 자동으로 RunLoop를 설정하고 실행해주기 때문

공식문서에서는 Loop를 running하는 메서드 4가지가 있다고한다.

Run Loop는 언제 사용???

Main Thread 이외에 Thred를 직접 생성하여 작업할 때

  • Input Source를 통해 다른 Thread와 통신하는 경우
  • Timer를 사용해야 하는 경우
  • Perform Selector Source를 사용해야 하는 경우
  • 주기적인 일을 계속 수행해야 하는 경우

참고
: https://jcsoohwancho.github.io/2019-09-01-%EC%8A%A4%EB%A0%88%EB%93%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D(2)-RunLoop/
: https://developer.apple.com/documentation/foundation/runloop

profile
예비 iOS 개발자의 기록

0개의 댓글