본문 바로가기
IOS - Swift

[iOS/Swift] Run Loop - (1 / 2)

by 게게겍 2023. 8. 20.
  • 💡레이아웃 이해하기 -1 RunLoop 편

 

런루프 애플문서

공식문서

런루프란?

RunLoop 객체는 소켓, 파일, 키보드 마우스 등의 프로그래밍 입력 소스를 처리하는 이벤트 처리 루프이다.

 


RunLoop 객체는 창 시스템 및 Port 객체와 같은 소스에서 마우스 및 키보드 이벤트를 처리합니다. 또한 RunLoop 객체는 Timer 이벤트도 처리합니다.

애플리케이션은 RunLoop 객체를 생성하거나 명시적으로 관리하지 않습니다. 시스템은 각 Thread 객체에 필요한 경우 RunLoop 객체를 생성하며, 애플리케이션의 메인 스레드도 포함됩니다. 현재 스레드의 run loop에 액세스해야 하는 경우 클래스 메서드 current를 사용하세요.

RunLoop의 관점에서 볼 때, Timer 객체는 "입력"이 아닌 특별한 유형인 점에 유의하세요. Timer 객체는 발생할 때 run loop가 반환되도록하진 않습니다.

 

어… 대충 생각해보면 사용자의 입력소스를 받아서 이벤트를 처리하는 과정이고 Timer를 같이 처리한다 라는것 같습니다. 예시를 통해서 살펴보겟습니다.

RunLoop는 Thread의 외부 입력 소스 및 Timer를 처리할 때 사용됩니다.

하지만 공식문서상에서 말하는것은

모든 Thread 는 각자의 RunLoop 를 가질수 있는가? - O

Thread를 생성할 때 RunLoop가 같이 생성되는가 -X

Current 메서드를 사용할때 생성후 반환이라고 작성되어 있습니다. 즉, current를 사용해서 런루프에 접근할때 RunLoop가 없으면 해당 시점에서 생성됩니다.

→ 이어지는 내용이지만 런루프가 있더라도 자동으로 실행되는것은 아니며 입력 소스나 Timer를 통해서 직접 실행해야 합니다. (Main Run Loop 제외)

즉, 내가 생성한 Thread 에 대한 RunLoop를 직접 얻어서 실행시켜주어야 합니다.

이를 직접 얻기 위해서는 다음과 같이 current 메서드를 이용합니다.

Class var current: RunLoop { get }

이 메서드를 사용하기 위해서는

let runLoop = RunLoop.current

이와같은 방식으로 현재 쓰레드에 대한 런루프를 얻을수 있습니다.

(대충 이런식으로 좌라락 나옵니다)

해당 쓰레드에 대한 런루프가 이미 있을 경우 그 런루프를 가져오고, 런루프가 없다면 런루프를 새로 생성해서 반환합니다.

하지만 실행 결과에서 알수 있듯이 내가 RunLoop를 얻엇더라도 입력소스, 타이머를 처리해주지 않습니다.

 

 

 

 

 

-2부에서 계속

 

 

출처