標籤:技術分享 入口 代碼 分享 .com images 邏輯 時間 ios開發
一般來講,一個線程一次只能執行一個任務,執行完畢後線程就會退出,如果我們需要一個機制讓線程能隨時處理時間但並不退出,通常的代碼邏輯是這樣:
這就是 Event Loop架構。
runloop實際上就是一個管理其需要處理的事件和訊息的對象,並提供了一個入口函數來執行上面Event loop的邏輯。線程執行了這個函數之後,就會一直處於這個函數內部“接受訊息-》等待-》處理”的迴圈中,知道這個迴圈結束(例如傳入quite訊息),函數返回。
在OSX和iOS系統中,提供了兩個這樣的對象:NSRunLoop和CFRunLoopRef。
CFRunLoopRef是基於CoreFoundation架構內的,它提供了純C函數的API,所有這些API都是安全執行緒的。
NSRunLoop是基於CFRunLoopRef的封裝,提供物件導向的API,但是這些API不是安全執行緒的。
RunLoop和線程的關係:iOS開發中有兩個線程對象-pthread_t和NSThread。pthread_tNSThread是一一對應的。比如你可以通過pthrea_main_thread_np()或者[NSThread currentThread]來擷取當前線程。CFRunLoop是基於pthread來管理的。
蘋果不允許直接建立RunLoop,但是提供了兩個自動擷取的函數:CFRunLoopGetMain()和CGRunLoopGetCurrent()。這兩個函數的內部邏輯大概為:
線程和RunLoop之間是一一對應的,其關係是儲存在一個全域的Dictionary裡。線程剛建立時並沒有RunLoop,如果你不主動擷取,它一直都不會有。runloop的建立是發生在第一次擷取的時候,銷毀時線上程結束時。你只能在一個線程的內部擷取其RunLoop(主線程除外)。
Event驅動 主體就是一個死迴圈,沒事-休眠,有事-喚醒-執行
runloop:用於結局
1、使程式一直運行並接受使用者輸入
2、決定程式在何時應該處理哪些Event
3、調用解耦(Message Queue)
4、節省cpu時間
iOS開發線程和RunLoop