iOS開發線程和RunLoop

來源:互聯網
上載者:User

標籤:技術分享   入口   代碼   分享   .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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.