///RunLoop的實(shí)現(xiàn)
int CFRunLoopRunSpecific(runloop,modeName,seconds,stopAfterHandle)
?{
? ? ///首先根據(jù)modeName找到對應(yīng)mode
? ? CFRunLoopModeRef currentMode = __CFRunLoopFindMode(runloop,modeName,false);
? ? //如果mode里沒有source/timer/observer,直接返回告嘲。
? ? if(__CFRunLoopModeIsEmpty(currentMode))
?? ? ? return;
? ? // 1.通知Observers: RunLoop即將進(jìn)入loop。
? ? __CFRunLoopDoObservers(runloop,currentMode,kCFRunLoopEntry);
?//內(nèi)部函數(shù)熙兔,進(jìn)入loop
? ? __CFRunLoopRun(runloop,currentMode,seconds,returnAfterSourceHandled)
?{
? ? ? ?Boolean sourceHandledThisLoop = NO;
? ? ? ? int retVal = 0;
? ? ? ? do {
? ? ? ? ? ? // 2.通知Observers: RunLoop即將觸發(fā)Timer回調(diào)效斑。
? ? ? ? ? ? __CFRunLoopDoObservers(runloop,currentMode,kCFRunLoopBeforeTimers);
? ? ? ? ? ? // 3.通知Observers: RunLoop即將觸發(fā)Source0(非port)回調(diào)盈罐。
? ? ? ? ? ? __CFRunLoopDoObservers(runloop,currentMode,kCFRunLoopBeforeSources);
? ? ? ? ? ? ///執(zhí)行被加入的block
? ? ? ? ? ? __CFRunLoopDoBlocks(runloop,currentMode);
? ? ? ? ? ? // 4. RunLoop觸發(fā)Source0(非port)回調(diào)。
? ? ? ? ? ? sourceHandledThisLoop = __CFRunLoopDoSources0(runloop,currentMode,stopAfterHandle);
? ? ? ? ? ? //執(zhí)行被加入的block
? ? ? ? ? ? __CFRunLoopDoBlocks(runloop,currentMode);
? ? ? ? ? ? // 5.如果有Source1(基于port)處于ready狀態(tài)八匠,直接處理這個(gè)Source1然后跳轉(zhuǎn)去處理消息遭笋。
? ? ? ? ? ? if(__Source0DidDispatchPortLastTime)?
? ? ? ? {
? ? ? ? ? ? ? ? Boolean hasMsg = __CFRunLoopServiceMachPort(dispatchPort,&msg)
? ? ? ? ? ? ? ? if(hasMsg)goto handle_msg;
? ? ? ? ? ? }
? ? ? ? ? ? //通知Observers: RunLoop的線程即將進(jìn)入休眠(sleep)。
? ? ? ? ? ? if(!sourceHandledThisLoop)?
{ ? ? ? ? ? ? ? ?__CFRunLoopDoObservers(runloop,currentMode,kCFRunLoopBeforeWaiting);
? ? ? ? ? ? }
? ? ? ? ? ? // 7.調(diào)用mach_msg等待接受mach_port的消息壶硅。線程將進(jìn)入休眠,直到被下面某一個(gè)事件喚醒威兜。
? ? ? ? ? ? //一個(gè)基于port的Source的事件。
? ? ? ? ? ? //一個(gè)Timer到時(shí)間了
? ? ? ? ? ? // RunLoop自身的超時(shí)時(shí)間到了
? ? ? ? ? ? //被其他什么調(diào)用者手動(dòng)喚醒
? ? ? ? ? ? __CFRunLoopServiceMachPort(waitSet,&msg,sizeof(msg_buffer),&livePort){
? ? ? ? ? ? ? ? mach_msg(msg,MACH_RCV_MSG,port);// thread wait for receive msg
? ? ? ? ? ? }
? ? ? ? ? ? // 8.通知Observers: RunLoop的線程剛剛被喚醒了庐椒。
? ? ? ? ? ? __CFRunLoopDoObservers(runloop,currentMode,kCFRunLoopAfterWaiting);
? ? ? ? ? ? //收到消息椒舵,處理消息。
? ? ? ? ? ? handle_msg:
? ? ? ? ? ? // 9.1如果一個(gè)Timer到時(shí)間了约谈,觸發(fā)這個(gè)Timer的回調(diào)笔宿。
? ? ? ? ? ? if(msg_is_timer){
? ? ? ? ? ? ? ? __CFRunLoopDoTimers(runloop,currentMode,mach_absolute_time())
? ? ? ? ? ? }?
? ? ? ? ? ? // 9.2如果有dispatch到main_queue的block,執(zhí)行block棱诱。
? ? ? ? ? ? else if(msg_is_dispatch){
? ? ? ? ? ? ? ? __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__(msg);
? ? ? ? ? ? }?
? ? ? ? ? ? /// 9.3如果一個(gè)Source1(基于port)發(fā)出事件了泼橘,處理這個(gè)事件
? ? ? ? ? ? else {
? ? ? ? ? ? ? ? CFRunLoopSourceRef source1 = __CFRunLoopModeFindSourceForMachPort(runloop,currentMode,livePort);
? ? ? ? ? ? ? ? sourceHandledThisLoop = __CFRunLoopDoSource1(runloop,currentMode,source1,msg);
? ? ? ? ? ? ? ? if(sourceHandledThisLoop){
? ? ? ? ? ? ? ? ? ? mach_msg(reply,MACH_SEND_MSG,reply);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //執(zhí)行加入到Loop的block
? ? ? ? ? ? __CFRunLoopDoBlocks(runloop,currentMode);
? ? ? ? ? ? if(sourceHandledThisLoop && stopAfterHandle){
? ? ? ? ? ? ? ? ///進(jìn)入loop時(shí)參數(shù)說處理完事件就返回。
? ? ? ? ? ? ? ? retVal = kCFRunLoopRunHandledSource;
? ? ? ? ? ? } else if(timeout){
? ? ? ? ? ? ? ? //超出傳入?yún)?shù)標(biāo)記的超時(shí)時(shí)間了
? ? ? ? ? ? ? ? retVal = kCFRunLoopRunTimedOut;
? ? ? ? ? ? } else if(__CFRunLoopIsStopped(runloop)){
? ? ? ? ? ? ? ? //被外部調(diào)用者強(qiáng)制停止了
? ? ? ? ? ? ? ? retVal = kCFRunLoopRunStopped;
? ? ? ? ? ? } else if(__CFRunLoopModeIsEmpty(runloop,currentMode)){
? ? ? ? ? ? ? ? // source/timer/observer一個(gè)都沒有了
? ? ? ? ? ? ? ? retVal = kCFRunLoopRunFinished;
? ? ? ? ? ? }
? ? ? ? ? ? //如果沒超時(shí)迈勋,mode里沒空炬灭,loop也沒被停止,那繼續(xù)loop靡菇。
? ? ? ? } while(retVal == 0);
? ? }
? ? // 10.通知Observers: RunLoop即將退出重归。
? ? __CFRunLoopDoObservers(rl,currentMode,kCFRunLoopExit);
}