실행 루프는 시스템 입력 소스 (소켓, 포트, 파일, 키보드, 마우스, 타이머 등)를 처리하는 메커니즘을 제공하는 추상화입니다.
각 NSThread에는 currentRunLoop 메서드를 통해 액세스 할 수있는 자체 실행 루프가 있습니다.
일반적으로 I / O 처리에 사용할 실행 루프를 지정할 수있는 일부 (네트워킹) 구성 요소가 있지만 실행 루프에 직접 액세스 할 필요가 없습니다.
주어진 스레드에 대한 실행 루프는 하나 이상의 입력 소스에 데이터 또는 이벤트가있을 때까지 기다린 다음 적절한 입력 핸들러를 실행하여 "준비된"각 입력 소스를 처리합니다.
그런 다음 루프로 돌아가서 다양한 소스의 입력을 처리하고 수행 할 작업이 없으면 "휴면"합니다.
이것은 매우 높은 수준의 설명입니다 (너무 많은 세부 사항을 피하려고합니다).
편집하다
댓글을 다루려는 시도. 나는 그것을 산산조각 냈다.
- 스레드 내부에서 루프를 실행하기 위해 액세스 / 실행 만 할 수 있다는 의미입니까?
과연. NSRunLoop은 스레드로부터 안전하지 않으며 루프를 실행하는 스레드의 컨텍스트에서만 액세스해야합니다.
- 루프를 실행하기 위해 이벤트를 추가하는 방법에 대한 간단한 예가 있습니까?
포트를 모니터링하려면 해당 포트를 실행 루프에 추가하면 실행 루프가 해당 포트의 활동을 감시합니다.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
다음을 사용하여 명시 적으로 타이머를 추가 할 수도 있습니다.
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- 그런 다음 루프로 돌아 간다는 의미는 무엇입니까?
실행 루프는 모드에 따라 반복 할 때마다 모든 준비 이벤트를 처리합니다. 일반적인 대답의 범위를 약간 벗어난 실행 모드에 대해 알아 보려면 설명서를 참조해야합니다.
- 스레드를 시작할 때 실행 루프가 비활성화됩니까?
대부분의 애플리케이션에서 메인 런 루프는 자동으로 실행됩니다. 그러나 실행 루프를 시작하고 회전하는 스레드에 대한 수신 이벤트에 응답하는 것은 사용자의 책임입니다.
- 스레드 외부의 스레드 실행 루프에 일부 이벤트를 추가 할 수 있습니까?
여기서 무슨 뜻인지 잘 모르겠습니다. 런 루프에 이벤트를 추가하지 않습니다. 입력 소스와 타이머 소스를 추가합니다 (런 루프를 소유 한 스레드에서). 그런 다음 실행 루프는 활동을 감시합니다. 물론 다른 스레드 및 프로세스에서 데이터 입력을 제공 할 수 있지만 입력은 실행 루프를 실행하는 스레드에서 해당 소스를 모니터링하는 실행 루프에 의해 처리됩니다.
- 그것은 때때로 내가 한동안 스레드를 차단하기 위해 실행 루프를 사용할 수 있다는 것을 의미합니까?
과연. 실제로 실행 루프는 이벤트 핸들러가 반환 될 때까지 이벤트 핸들러에 "유지"됩니다. 모든 앱에서 간단히 볼 수 있습니다. 휴면 상태 인 모든 IO 작업 (예 : 버튼 누름)에 대한 핸들러를 설치합니다. 해당 메서드가 완료 될 때까지 기본 실행 루프 (및 전체 UI)를 차단합니다.
모든 런 루프에도 동일하게 적용됩니다.
런 루프에 대한 다음 문서를 읽는 것이 좋습니다.
https://developer.apple.com/documentation/foundation/nsrunloop
스레드 내에서 사용되는 방법 :
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1