NSRunLoop 이해
누구든지 설명 할 수 있습니까 NSRunLoop
? 그래서 내가 아는 것처럼 NSRunLoop
뭔가 연결되어 NSThread
있지 않습니까? 그래서 내가 같은 스레드를 만든다고 가정합니다
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];
-(void) someMethod
{
NSLog(@"operation");
}
이 스레드가 작업을 마치고 나면? 왜 사용 RunLoops
하거나 어디에 사용합니까? Apple 문서에서 읽은 내용이 있지만 명확하지 않으므로 가능한 한 간단하게 설명하십시오.
실행 루프는 시스템 입력 소스 (소켓, 포트, 파일, 키보드, 마우스, 타이머 등)를 처리하는 메커니즘을 제공하는 추상화입니다.
각 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
스레드 내에서 사용되는 방법 :
RunLoops는 상황이 발생하는 상자와 비슷합니다.
기본적으로 RunLoop에서 일부 이벤트를 처리 한 다음 반환합니다. 또는 시간 제한에 도달하기 전에 이벤트를 처리하지 않으면 반환합니다. 비동기 NSURLConnections, 현재 루프를 방해하지 않고 백그라운드에서 데이터를 처리하는 것과 비슷하지만 동시에 데이터가 동 기적으로 필요하다고 말할 수 있습니다. 비 동기화 NSURLConnection
하고 호출 시간에 데이터를 제공 하는 RunLoop의 도움으로 수행 할 수 있습니다 . 다음과 같이 RunLoop을 사용할 수 있습니다.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) {
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
}
이 RunLoop에서는 다른 작업을 완료하고 YourBoolFlag 를 false로 설정할 때까지 실행됩니다 .
마찬가지로 스레드에서 사용할 수 있습니다.
도움이 되었기를 바랍니다.
실행 루프는 무엇 분리 인터랙티브 에서 응용 프로그램 명령 줄 도구를.
- Command-line tools are launched with parameters, execute their command, then exit.
- Interactive apps wait for user input, react, then resume waiting.
From here
They allow you to wait till user taps and respond accordingly, wait till you get a completionHandler and apply its results, wait till you get a timer and perform a function. If you don't have a runloop then you can't be listening/waiting for user taps, you can't wait till a network call is happening, you can't be awoken in x minutes.
Also from this comment:
Background threads don't have their own runloops, but you can just add one. E.g. AFNetworking 2.x did it. It was tried and true technique for NSURLConnection or NSTimer on background threads, but we don't do this ourselves much anymore, as newer APIs eliminate the need to do so. But it appears that URLSession does, e.g., here is simple request, running [see the left panel of the image] completion handlers on the main queue, and you can see it has a run loop on background thread
Run loops are part of the fundamental infrastructure associated with threads. A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread busy when there is work to do and put your thread to sleep when there is none.
The most important feature of CFRunLoop is the CFRunLoopModes. CFRunLoop works with a system of “Run Loop Sources”. Sources are registered on a run loop for one or several modes, and the run loop itself is made to run in a given mode. When an event arrives on a source, it is only handled by the run loop if the source mode matches the run loop current mode.
참고URL : https://stackoverflow.com/questions/12091212/understanding-nsrunloop
'developer tip' 카테고리의 다른 글
전체 경로가 제공되었는지 확인하십시오. (0) | 2020.08.23 |
---|---|
Eclipse for Java에서 별도의 줄에 체인 메서드 호출 래핑 (0) | 2020.08.23 |
소켓 연결 시간 초과를 구성하는 방법 (0) | 2020.08.23 |
Java에서 NaN은 무엇을 의미합니까? (0) | 2020.08.23 |
색상에서 브러시로 변환 (0) | 2020.08.23 |