Runloop總結

Runloop

用戶態, 內核態???什麼意思 machport是什麼?

什麼是runloop?

runloop是通過內部維護的事件循環來對事件/消息進行管理的一個對象

事件循環是什麼?(要回答出切換狀態)

.沒有消息需要處理時, 會發生一個從用戶態到內核態的切換, 休眠以避免資源佔用(不是簡單的,while do..while循環)   

.有消息需要處理時,會發生一個從內核態到用戶態的切換.立刻被喚醒


我們的main函數爲什麼能保持不退出?

在main函數中所調用的UIApplicationMain, 在這個函數內部, 會啓動主線程的runloop, 而runloop

是一種對事件循環的維護機制,可以做到有事做的時候去做事, 沒有事情做的時候, 會通過用戶態到內核態的切換, 從而避免資源的佔用,然後當前線程是處於一個休眠的狀態.


NSRunloopfoundation框架中的, CFRunloopcorefoundation框架中是開源的





免費橋轉換


檢測時間點要記住  含義??? 




runloopmodel的關係如上 

runloop啓動之後會發送一個消息給觀察者它要即將啓動, (]表示需要發送通知的消息)

之後runloop發送處理timer/source0的事件通知, 之後在進行處理source0, source1需要處理時, 會通過goto語句跳去處理,處理喚醒時收到的消息, 如果沒有則線程發送一個將要休眠的通知給Observa, 然後發生了一個從用戶態到內核態的切換, 線程正式進行休眠.

喚醒的條件

source1, timer事件的回調, 外部手動事件的喚醒

線程被喚醒之後, 會通知觀察者當前線程被喚醒了, 然後處理喚醒時所處理的消息, 然後回到處理timer/source0事件, 然後依次向下執行


程序從點擊一個圖標, 到啓動, 運行, 到被殺死, 系統發生了什麼?

調用main函數之後, 會調用UIApplicationMain函數, 在這個函數中, 會啓動主線程的runloop,然後經過一系列的處理, 主線程的runloop處於休眠狀態,如果此時點擊一個屏幕, 會產生一個machport, 基於machport,最終轉成一個sorce1, 喚醒主線程,運行, 處理,然後處理,當把程序殺死, 會發生runloop的一個退出.runloop會發送一個即將退出的通知, 然後runloop退出之後, 線程也就銷燬掉了.



runlooptimer看筆記本上面的


怎樣實現一個常駐線程


在用戶進行滑動的時候, 是運行在UITrackingMode中, 一般網絡請求是在子線程中進行的, 子線程返回給主線程的數據拋給主線程用來更新UI, 這個時候,把子線程拋給主線程的邏輯包裝起來, 提交到主線程的UIDefaultMode中, (performSelector:onThread:witgObject:waitUntilDone:modes:)滑動在UITracking模式下面, 這個提交到default模式下的任務便不會處理,當滑動停止之後, 這個model會切換到default模式下, 這個時候就會處理子線程給主線程的任務, 這樣就不會打斷用戶的操作.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章