日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

分析IOS RunLoop的事件循環機制

瀏覽:132日期:2022-09-16 15:44:18

在RunLoop啟動之后會發送一個通知,來告知觀察者

將要處理Timer/Source0事件這樣一個通知的發送

處理Source0事件

如果有Source1要處理,這時會通過一個go to語句的實現來進行代碼邏輯的跳轉,處理喚醒是收到的消息

如果沒有Source1要處理,線程就將要休眠,同時發送一個通知,告訴觀察者

然后線程進入一個用戶態到內核態的切換,休眠,然后等待喚醒,喚醒的條件大約包括三種:

1、Source1

2、Timer事件

3、外部手動喚醒

線程剛被喚醒之后也要發送一個通知告訴觀察者,然后處理喚醒時收到的消息

回到將要處理Timer/Source0事件這樣一個通知的發送

然后再次進行上面步驟,這就是一個RunLoop的事件循環機制

內部代碼邏輯整理如下:

/// 用DefaultMode啟動void CFRunLoopRun(void) { CFRunLoopRunSpecific(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 1.0e10, false);} /// 用指定的Mode啟動,允許設置RunLoop超時時間int CFRunLoopRunInMode(CFStringRef modeName, CFTimeInterval seconds, Boolean stopAfterHandle) { return CFRunLoopRunSpecific(CFRunLoopGetCurrent(), modeName, seconds, returnAfterSourceHandled);} /// RunLoop的實現int CFRunLoopRunSpecific(runloop, modeName, seconds, stopAfterHandle) {/// 首先根據modeName找到對應mode CFRunLoopModeRef currentMode = __CFRunLoopFindMode(runloop, modeName, false); /// 如果mode里沒有source/timer/observer, 直接返回。 if (__CFRunLoopModeIsEmpty(currentMode)) return;/// 1. 通知 Observers: RunLoop 即將進入 loop。 __CFRunLoopDoObservers(runloop, currentMode, kCFRunLoopEntry);/// 內部函數,進入loop __CFRunLoopRun(runloop, currentMode, seconds, returnAfterSourceHandled) {Boolean sourceHandledThisLoop = NO;int retVal = 0;do { /// 2. 通知 Observers: RunLoop 即將觸發 Timer 回調。 __CFRunLoopDoObservers(runloop, currentMode, kCFRunLoopBeforeTimers); /// 3. 通知 Observers: RunLoop 即將觸發 Source0 (非port) 回調。 __CFRunLoopDoObservers(runloop, currentMode, kCFRunLoopBeforeSources); /// 執行被加入的block __CFRunLoopDoBlocks(runloop, currentMode);/// 4. RunLoop 觸發 Source0 (非port) 回調。 sourceHandledThisLoop = __CFRunLoopDoSources0(runloop, currentMode, stopAfterHandle); /// 執行被加入的block __CFRunLoopDoBlocks(runloop, currentMode); /// 5. 如果有 Source1 (基于port) 處于 ready 狀態,直接處理這個 Source1 然后跳轉去處理消息。 if (__Source0DidDispatchPortLastTime) {Boolean hasMsg = __CFRunLoopServiceMachPort(dispatchPort, &msg)if (hasMsg) goto handle_msg; }/// 通知 Observers: RunLoop 的線程即將進入休眠(sleep)。 if (!sourceHandledThisLoop) {__CFRunLoopDoObservers(runloop, currentMode, kCFRunLoopBeforeWaiting); }/// 7. 調用 mach_msg 等待接受 mach_port 的消息。線程將進入休眠, 直到被下面某一個事件喚醒。 /// • 一個基于 port 的Source 的事件。 /// • 一個 Timer 到時間了 /// • RunLoop 自身的超時時間到了 /// • 被其他什么調用者手動喚醒 __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 如果一個 Timer 到時間了,觸發這個Timer的回調。 if (msg_is_timer) {__CFRunLoopDoTimers(runloop, currentMode, mach_absolute_time()) } /// 9.2 如果有dispatch到main_queue的block,執行block。 else if (msg_is_dispatch) {__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__(msg); } /// 9.3 如果一個 Source1 (基于port) 發出事件了,處理這個事件 else {CFRunLoopSourceRef source1 = __CFRunLoopModeFindSourceForMachPort(runloop, currentMode, livePort);sourceHandledThisLoop = __CFRunLoopDoSource1(runloop, currentMode, source1, msg);if (sourceHandledThisLoop) { mach_msg(reply, MACH_SEND_MSG, reply);} }/// 執行加入到Loop的block __CFRunLoopDoBlocks(runloop, currentMode); if (sourceHandledThisLoop && stopAfterHandle) {/// 進入loop時參數說處理完事件就返回。retVal = kCFRunLoopRunHandledSource; } else if (timeout) {/// 超出傳入參數標記的超時時間了retVal = kCFRunLoopRunTimedOut; } else if (__CFRunLoopIsStopped(runloop)) {/// 被外部調用者強制停止了retVal = kCFRunLoopRunStopped; } else if (__CFRunLoopModeIsEmpty(runloop, currentMode)) {/// source/timer/observer一個都沒有了retVal = kCFRunLoopRunFinished; }/// 如果沒超時,mode里沒空,loop也沒被停止,那繼續loop。} while (retVal == 0); }/// 10. 通知 Observers: RunLoop 即將退出。 __CFRunLoopDoObservers(rl, currentMode, kCFRunLoopExit);}

可以看到,實際上 RunLoop 就是這樣一個函數,其內部是一個do-while循環。當你調用CFRunLoopRun()時,線程就會一直停留在這個循環里;直到超時或被手動停止,該函數才會返回

有一個這樣的問題:當我們點擊一個app,從我們點擊到程序啟動、程序運行再到程序殺死這個過程,系統都發生了什么呢?

實際上當我們調用了main函數之后,會調用UIApplicationMain函數,在這個函數內部會啟動主線程的RunLoop,然后經過一系列的處理,最終主線程的RunLoop會處于一個休眠狀態,然后我們此時如果點擊一下屏幕,會轉化成一個Source1來讓我們的主線程喚醒,然后當我們殺死程序時,會調用RunLoop的退出,同時發送通知告訴觀察者

找到一張總結圖幫助記憶:

分析IOS RunLoop的事件循環機制

以上就是分析IOS RunLoop的事件循環機制的詳細內容,更多關于IOS RunLoop的事件循環機制的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品毛片在线看| 亚洲精品乱码| 日本免费一区二区三区四区| 国产精品1区| 国产麻豆一区| 一区视频在线| 激情综合自拍| 亚洲激情另类| 蜜桃av一区二区在线观看| 日韩亚洲精品在线| 亚洲欧美视频| 日韩av午夜在线观看| 欧美日本一区| 久久一区亚洲| 国产精品日韩精品中文字幕| 国产精品一区二区三区www| 国产精品久久久久久久久久齐齐| 国产精品久久久久久久久久齐齐 | 久久久久午夜电影| 好看的亚洲午夜视频在线| 老司机精品久久| 国产色噜噜噜91在线精品| 久久99国产精品视频| 色天使综合视频| 最新日韩欧美| 日韩高清在线不卡| 国产精品第十页| 激情综合五月| 免费国产自久久久久三四区久久| 免费在线看一区| 久久超级碰碰| 久久美女精品| 91精品美女| 在线手机中文字幕| 黄色成人精品网站| 日韩av一区二区三区| 狠狠久久伊人| 国产亚洲欧美日韩在线观看一区二区| 日本在线高清| 亚洲免费毛片| 奇米色欧美一区二区三区| 日本免费一区二区三区四区| 香蕉久久国产| 成人精品视频| 久久超碰99| 国产精品一区二区中文字幕| 在线综合亚洲| 尹人成人综合网| 91亚洲精品视频在线观看| 狠狠久久伊人| 免费看欧美美女黄的网站| 国产精品mv在线观看| 国产精品av久久久久久麻豆网| 亚洲精品麻豆| 亚洲国产福利| 五月亚洲婷婷 | 日本少妇一区二区| 日韩成人综合| 日韩和欧美的一区| 日韩另类视频| 久久精品凹凸全集| 女人天堂亚洲aⅴ在线观看| 国产亚洲精品精品国产亚洲综合| 亚洲a一区二区三区| 日韩精品一页| 日韩国产一区| 久久国产三级| 女同性一区二区三区人了人一| 国产免费播放一区二区| 欧美中文一区二区| 国产精品1luya在线播放| 中文在线一区| 国产成人77亚洲精品www| 免费观看日韩电影| 日本欧美不卡| 国产精品免费99久久久| 精品91久久久久| 日本不卡免费高清视频在线| 黄页网站一区| 精品在线播放| 亚洲激情av| 国产精品九九| 在线看片国产福利你懂的| 天堂网在线观看国产精品| 日韩中文字幕无砖| 久久精品青草| 亚洲精品在线a| 另类小说一区二区三区| 石原莉奈在线亚洲三区| 亚洲综合在线电影| 国产精品久久久久久久久久白浆| 免费日韩一区二区| 亚洲综合在线电影| 国产一区二区视频在线看| 国产精品视频一区视频二区| 亚洲综合另类| 日韩欧美精品一区| 欧美激情福利| 欧美日韩一区二区三区在线电影| 玖玖玖国产精品| 妖精视频成人观看www| 亚洲四虎影院| av高清不卡| 国产一区丝袜| 国产高清亚洲| 国产精品一区二区三区www| 亚洲资源在线| 亚洲精品观看| 亚洲资源在线| 亚洲欧洲美洲国产香蕉| 亚洲精品99| 日韩精品免费一区二区三区| 91亚洲成人| 人在线成免费视频| 韩国三级一区| 日韩欧美一区免费| 粉嫩av一区二区三区四区五区 | 久久久久久久久丰满| 国产不卡精品在线| 国产一区二区三区91| 欧美激情视频一区二区三区在线播放| 国产美女久久| 免费人成在线不卡| 亚洲午夜一级| 美国欧美日韩国产在线播放| 激情黄产视频在线免费观看| 国产欧美日韩精品一区二区免费| 亚洲一区二区免费在线观看| 欧美日韩少妇| 青青草国产精品亚洲专区无| 国产欧美自拍| 欧美va天堂在线| 国产精品xxx| 日韩精选在线| 国产精品3区| 久久电影tv| 亚洲v在线看| 亚洲91视频| 亚洲综合电影一区二区三区| 制服诱惑一区二区| 丝袜脚交一区二区| 日韩二区在线观看| 国产精品久久久免费| 成人黄色av| 免费日韩av片| 日韩电影免费网站| 日本少妇一区| 日韩一区欧美| 精品欧美激情在线观看| 狠狠色综合网| 蜜桃av一区二区三区电影| 日韩精品亚洲专区在线观看| 日韩综合一区二区| 国产欧美日韩精品一区二区免费 | 手机在线电影一区| 蜜桃成人精品| 先锋亚洲精品| 91精品丝袜国产高跟在线| 另类欧美日韩国产在线| 亚洲精品88| 午夜在线播放视频欧美| 日韩一二三区在线观看| 久久99影视| 91tv亚洲精品香蕉国产一区| 99久久婷婷| 日韩区欧美区| 高清一区二区| 快she精品国产999| 国产精品日韩精品中文字幕| 日韩在线视频精品| 国产精品一区高清| 国产欧美欧美| 另类国产ts人妖高潮视频| 国产一区二区视频在线看| 亚洲精品福利| 91嫩草精品| 国产精品亚洲人成在99www| 久久不射网站| 欧美精品一线| 亚洲特色特黄| 精品中文一区| 欧美精品国产一区| 日韩毛片视频| 亚洲ww精品| 精品国产一区二区三区性色av| 久久精品影视| 国产日韩在线观看视频| 美女网站视频一区| 亚洲tv在线| 日韩国产网站| 久久精品超碰| 99国产精品视频免费观看一公开| 国产欧美丝祙| 久久精品青草| 日韩午夜视频在线| 久久精品动漫| 国产精品a级| 免费日本视频一区| 中文在线资源| 久久99久久久精品欧美|