iOS RUN LOOP 是個什麼東西?

RUN Loop是什麼?

 

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 。

 

  1. <pre name="code" class="html"
  1. <pre name="code" class="html">  

 

 

4。run loop 啓動順序

  1. 通知觀察者,run loop啓動
  2. 通知觀察者任何即將要開始的定時器
  3. 通知觀察者任何非基於端口的源即將啓動
  4. 啓動任何準備好的非基於端口的源
  5. 如果基於端口的源準備好並處於等待狀態,立即啓動;並進入步驟9。
  6. 通知觀察者線程進入休眠
  7. 將線程之於休眠直到任一下面的事件發生
  • 某一事件到達基於端口的源
  • 定時器啓動
  • 設置了run loop的終止時間
  • run loop喚醒
  1. 通知觀察者線程將被喚醒。
  2. 處理未處理的事件
  • 如果用戶定義的定時器啓動,處理定時事件並重啓run loop。進入步驟2
  • 如果輸入源啓動,傳遞相應的消息
  • run loop喚醒但未終止,重啓。進入步驟2
  1. 通知觀察者run loop結束。
    1. 通知觀察者,run loop啓動
    2. 通知觀察者任何即將要開始的定時器
    3. 通知觀察者任何非基於端口的源即將啓動
    4. 啓動任何準備好的非基於端口的源
    5. 如果基於端口的源準備好並處於等待狀態,立即啓動;並進入步驟9。
    6. 通知觀察者線程進入休眠
    7. 將線程之於休眠直到任一下面的事件發生
    • 某一事件到達基於端口的源
    • 定時器啓動
    • 設置了run loop的終止時間
    • run loop喚醒
    1. 通知觀察者線程將被喚醒。
    2. 處理未處理的事件
    • 如果用戶定義的定時器啓動,處理定時事件並重啓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
 
發佈了23 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章