- 💡레이아웃 이해하기 -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부에서 계속
'IOS - Swift' 카테고리의 다른 글
[iOS/Swift] BottomSheet 구현하기 - 라이브러리 사용 (0) | 2023.09.10 |
---|---|
[iOS/Swift] Run Loop ( 2 / 2 ) (1) | 2023.08.27 |
[iOS/Swift] UIkit image Resizing ( 크기 / 품질) (0) | 2023.08.06 |
[iOS/Swift] Dependency Injection, 의존성 주입이란? (0) | 2023.07.30 |
Managing the view hierarchy 에 관하여 - 1 (0) | 2023.07.02 |