RunLoop이 뭐예요?

2645 단어

Event Loop 모델


만약 우리가 스레드가 수시로 사건을 처리할 수 있지만 종료되지 않도록 하는 메커니즘이 필요하다면 일반적인 코드 논리는 다음과 같다.
function loop() {
   initialize();
   do {
      var message = get_next_message();
      process_message(message);
   } while (message != quit);
}

이것이 바로 많은 시스템과 프레임워크에서 실현된 이벤트 Loop 모델, 예를 들어Node.js의 이벤트 처리, Windows 프로그램의 메시지 순환, 그리고 우리 OSX/iOS의 RunLoop, Event Loop 모델이 실현하는 관건은 이벤트/메시지를 어떻게 관리하는가, 정보를 처리하지 않을 때 라인을 휴면시켜 자원 점용을 피하는가이다.소식이 왔을 때 깨어났다.
따라서 RunLoop은 사실상 하나의 대상이다. 이 대상은 처리해야 할 이벤트와 메시지를 관리하고 입구 함수를 제공하여 위의 Event Loop의 논리를 집행한다.루틴이 이 함수를 실행하면 이 함수 내부의'메시지 받아들이기-->기다림-->처리'의 순환에서 이 순환이 끝난 것을 알고(예를 들어quit 메시지를 전송하는 것), 함수가 되돌아옵니다.

프로그램이 시작된 Run Loop


새 xcode 프로덕션 프로젝트에는 다음과 같은 코드 블록이 있습니다.
int main(int argc, char * argv[]) {
     @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class]));
    }
}

프로그램이 시작되면 위 코드가 호출되고 메인 라인도 실행되며 RunLoop도 실행됩니다.UIApplicationMain () 방법에서 프로그램 초기화를 완성하고 프로그램의Delegate 작업을 설정하며 메인 라인의 RunLoop을 열면 이벤트 처리를 받기 시작합니다.
RunLoop은 루틴의 입력을 받아들여 이벤트 처리 함수를 통해 이벤트를 처리하는 순환입니다.runloop을 구동하기 위해while or for 순환을 코드에 제공해야 합니다.순환에서runloop 대상으로 이벤트 처리와 관련된 내용을 구동하고 이벤트를 받아들이며 응답 처리를 합니다.
RunLoop은 루틴의 순환이며 받아들인 이벤트를 처리합니다.저희 코드는while 또는 for 순환을 제공하여RunLoop을 구동할 수 있습니다.루프 객체는 반복 중에 이벤트 처리 코드를 담당합니다(이벤트를 수락하고 적절한 이벤트 처리 방법을 호출).

RunLoop 프레임 객체 API


OSX/iOS 시스템에는 NSRunLoop과 CFRunLoopRef라는 두 개의 객체가 제공됩니다.CFRunLoopRef는CoreFoundation 프레임워크 내에 있으며 순수 C 함수의 API를 제공합니다. 모든 API는 라인이 안전합니다.NSRunLoop은 CFRunLoopRef의 봉인을 바탕으로 대상을 대상으로 하는 API를 제공하지만 이러한 API는 라인이 안전하지 않다.
CFRunLoopRef의 코드는 원본입니다. 당신은 여기에 있을 수 있습니다http://opensource.apple.com/tarballs/CF/전체 CoreFoundation의 소스를 다운로드하여 보십시오.
Swift가 오픈된 후 애플은 플랫폼을 뛰어넘는CoreFoundation 버전을 유지했다.https://github.com/apple/swift-corelibs-foundation/, 이 버전의 원본 코드는 기존 iOS 시스템의 구현과 약간 다르지만, 컴파일하기 쉽고, Linux/Windows와 잘 어울린다.

Cocoa는 RunLoops와 관련됨


시스템 수준: GCD, mach kernel, block, pthread 애플리케이션 수준: NSTimer, UIEvent, Autorelease, NSObject(NSDelayedPerforming), NSObject(NSThreadPerformAddition), CATransition, dispatchget_main_queue () (GCD에서 dispatch에서mainqueue까지의 Block은 dispatch에서main RunLoop에 실행됨), NSPort, NSURLconnection,AFNetworking (이 제3자 네트워크 요청 프레임워크는 새로운 라인을 열 때 자신의run loop 감청 이벤트를 추가하는 데 사용)

Main thread 스택의 위치


스택 맨 아래쪽은 start(dyld), 위쪽은main, UIAPplication(main.m)-> GSEventRunModal(Graphic Services)-> RunLoopRunSpecific, CFRunLoopRun, CFRunLoopDoSouces0, CFRUNLOOP IS CALING OUT TO A SOURCE0 PERFORM FUCTION - Handle TION Touch Tovent

좋은 웹페이지 즐겨찾기