1。runloop是事件接收和分發機制的一個實現。
2。什麼時候使用runloop
當需要和該線程進行交互的時候。主線程默認有runloop。當自己啓動一個線程,如果只是用於處理單一的事件,則該線程在執行完之後就退出了。所以當我們需要讓該線程即監聽某項事務事,就得讓線程一直不退出,runloop就是這麼一個循環,沒有事件的時候,一直卡着,有事件來臨了,執行其對應的函數
3。run loop需要處理的event source 有兩種:input sources(常是其他線程的異步的event)和 timer sources(定時器)。
Anatomy of a Run Loop
run loop,正如其名稱所示,是線程進入和被線程用來響應事件以及調用事件處理函數的地方。需要在代碼中使用控制語句實現run loop的循環,也就是說,需要代碼提供while 或者 for循環來驅動run loop。在這個循環中,使用一個runloop對象[NSRunloop currentRunloop]執行接收消息,調用對應的處理函數。
runloop接收來自兩種源事件,input sources和timer sources。前者傳遞異步事件,通常是來自其他線程和不同的程序中的消息;後者傳遞同步事件(重複執行或者在特定時間上觸發)。所有這兩種sources都有特定的代碼來處理。
input sources在調用了響應的處理函數之後會調用runUntilDate:使得runloop退出,而Timer sources不會調用runUntilDate:使得runloop退出。
除了處理input sources,runloop 也會產生一些關於本身行爲的notificaiton。註冊成爲runloop的observer,可以接收到這些notification,做一些額外的處理。(使用CoreFoundation來成爲runloop的observer)。
下面部分介紹runloop的組成部分以及runloop所處的runmode。同時也描述了不同時期產生的不同事件消息。
Run Loop Modes
一個runloop mode就是input sources、timer和observers的集合。每次執行runloop,都需要指定一個mode。在次期間,只有與該mode關聯的source纔會被監管和傳遞他們的事件,同樣只有相關的observer被通知。其他mode下的sourceshold新的事件,直到得到運行????Sourcesassociated with other modes hold on to any new events until subsequent passesthrough the loop in the appropriate mode.
在代碼中,mode的命名用string表示,有一些default mode和其他常用的modes。 可以使用字符串來標識一個自定義的mode。新建的自定義mode,至少需要一個inputsources或者timers或者 observers。
mode用來過濾掉你不想監聽的sources,使得你想要的事件通過你代碼中的循環。大數情況運行在default mode中,對於輔助線程,可以使用自定義mode來防止低優先級的sources傳遞事件,這樣如果當前操作是time-critical,可以省下資源。
Input Sources
input sources異步地傳遞事件給當前線程。input source 分兩類,Port-based和custom 。
- <pre name="code" class="html">
- <pre name="code" class="html">
4。run loop 啓動順序
- 通知觀察者,run loop啓動
- 通知觀察者任何即將要開始的定時器
- 通知觀察者任何非基於端口的源即將啓動
- 啓動任何準備好的非基於端口的源
- 如果基於端口的源準備好並處於等待狀態,立即啓動;並進入步驟9。
- 通知觀察者線程進入休眠
- 將線程之於休眠直到任一下面的事件發生
- 某一事件到達基於端口的源
- 定時器啓動
- 設置了run loop的終止時間
- run loop喚醒
- 通知觀察者線程將被喚醒。
- 處理未處理的事件
- 如果用戶定義的定時器啓動,處理定時事件並重啓run loop。進入步驟2
- 如果輸入源啓動,傳遞相應的消息
- run loop喚醒但未終止,重啓。進入步驟2
- 通知觀察者run loop結束。
- 通知觀察者,run loop啓動
- 通知觀察者任何即將要開始的定時器
- 通知觀察者任何非基於端口的源即將啓動
- 啓動任何準備好的非基於端口的源
- 如果基於端口的源準備好並處於等待狀態,立即啓動;並進入步驟9。
- 通知觀察者線程進入休眠
- 將線程之於休眠直到任一下面的事件發生
- 某一事件到達基於端口的源
- 定時器啓動
- 設置了run loop的終止時間
- run loop喚醒
- 通知觀察者線程將被喚醒。
- 處理未處理的事件
- 如果用戶定義的定時器啓動,處理定時事件並重啓run loop。進入步驟2
- 如果輸入源啓動,傳遞相應的消息
- run loop喚醒但未終止,重啓。進入步驟2
- 通知觀察者run loop結束。
5 。 何時需要在新線程中使用run loop
- 使用端口或自定義輸入源和其他線程通信
- 使用定時器
- cocoa中使用任何performSelector
- 使線程履行週期性任務
a developer做的官方sdk文檔中run loop的翻譯:http://www.cnblogs.com/scorpiozj/archive/2011/05/26/2058167.html