Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RunLoop란 무엇이며, App에서의 RunLoop는 몇 개인가요? #19

Open
youn9k opened this issue Jan 4, 2025 · 4 comments
Open

Comments

@youn9k
Copy link
Collaborator

youn9k commented Jan 4, 2025

  • 외부 입력 소스와 타이머 처리
  • 스레드의 대기 상태 관리
  • 메인 스레드와 다른 스레드의 런루프 설명
@Kiyoung-Kim-57
Copy link
Collaborator

Kiyoung-Kim-57 commented Jan 8, 2025

런루프는 스레드와 관련된 이벤트 처리 루프이다. 런루프는 터치 이벤트, 타이머와 같은 입력 소스를 관리한다.
앱은 런루프를 직접 생성하거나 명시적으로 관리하지 않는다. 대신 시스템이 필요에 따라 각 스레드의 런루프를 생성하고 관리한다.

스레드의 런루프에 접근하고 싶다면 RunLoop.current 속성을 통해 각 스레드의 런루프에 접근할 수 있다. 런루프에 명시적으로 접근할 때 런루프가 생성된다.

기본적으로 메인 스레드는 항상 하나의 런루프를 가지고 있고 시스템이 자동으로 실행하고 반복 처리한다.

메인 스레드 외의 추가적인 스레드는 각자의 런루프를 가지고 있지만 기본적으로 생성되지 않은 상태이다. 따라서 필요하다면 직접 스레드의 런루프를 명시적으로 실행시켜줘야 하고 이는 메인 스레드처럼 기본적으로는 반복 실행되지 않기 때문에 따로 처리가 필요하다.

즉 App에서 런루프의 개수는 기본적으로 생성되는 메인 스레드의 런루프와 추가된 스레드의 수를 더한만큼이라고 보면된다.
(메인 스레드 외의 스레드는 명시적으로 접근하지 않으면 런루프가 생성되지 않음)

@hsw1920
Copy link
Owner

hsw1920 commented Jan 8, 2025

Q. RunLoop에 대해서 설명해주세요.
A.
RunLoop는 이벤트 소스를 처리하고 스레드의 실행과 대기 상태를 관리하는 이벤트 처리 루프입니다. 이벤트가 발생할 때까지 스레드를 대기 상태로 두고, 이벤트가 발생하면 처리하는 구조를 제공하여 스레드가 필요할 때만 실행되도록 하여 리소스를 최적화합니다.

Q. App에서 RunLoop는 몇 개인가요?
A.
App 최소 실행 시 메인스레드에서 최소 1개의 RunLoop가 존재합니다.
앱 실행 시 UIApplicationMain 함수에 의해 메인 스레드의 RunLoop가 자동으로 생성됩니다. 반면, 백그라운드 스레드는 기본적으로 RunLoop가 없고, 필요에 따라 수동으로 개발자가 직접 설정해주어야합니다.

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 9, 2025

RunLoop는 애플의 OS에서 스레드의 이벤트를 관리하고 처리해주는 객체입니다.

주로 사용자 인터페이스 이벤트, 타이머, 니트워크 요청 등을 대기하고 처리하여 스레드가 종료되지 않고 지속적으로 실행될 수 있도록 도와주는 역할을 합니다.

앱에서는 기본적으로 메인 스레드를 처리하기 위한 메인 RunLoop가 하나 존재하며, 추가적으로 백그라운드 스레드들을 관리하기 위해 각 스레드 마다 별도의 RunLoop가 존재할 수 있습니다.

그렇기에 RunLoop의 개수는 최소 1개는 존재하고, 스레드의 수만큼 추가될 수 있습니다.

@youn9k
Copy link
Collaborator Author

youn9k commented Jan 10, 2025

RunLoop란?

런루프는 Event(Input Source, Timer)를 처리하는 루프 객체입니다.
수행해야 하는 작업이 있을 때 스레드를 일하게 하고, 수행해야 하는 작업이 없을 때는 스레드를 쉬게 하려는 목적으로 고안되었습니다.

App에서의 RunLoop는 몇 개인가요?

런루프는 스레드마다 존재할 수 있습니다.
하지만 스레드가 생성될 때 런루프가 같이 생성되는 것이 아니라 스레드에서 런루프에 접근할 때 생성됩니다.
따라서 메인스레드가 아닌 다른 스레드에 추가적으로 런루프를 생성하지 않는다면, 기본적으로 런루프는 메인런루프 1개만 존재할 것입니다.

let runLoop = RunLoop.current // 런루프에 접근할 때 생성

image

메인 런루프 동작 방식 그림

Main RunLoop 동작 방식

터치나 스와이프처럼 iOS에서 발생하는 모든 이벤트는 메인 런루프를 통해 처리됩니다.

터치와 같은 유저이벤트가 발생하면 다음과 같이 처리 됩니다.

  1. 이벤트(시스템 영역)를 생성
  2. 포트를 거쳐 Event Queue라는 대기열에 쌓임
  3. 런루프는 실행이 될 때 여기에 있는 이벤트들을 가져와 처리함.
    (루프라고 해서 자체적으로 무한 루프처럼 동작할 것 같지만 그렇지 않음)

런루프가 가져온 이벤트들은 UIApplication 객체에 전달되고 Core Object들 안에 있는 핸들러를 호출해줍니다.

핸들러들은 우리가 작성한 코드를 호출해주는데, 이러한 메소드들이 반환되면 다시 제어는 메인 런루프로 돌아가게 됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants