Runloop是事件接收和分發機制的一個實現。 Runloop提供了一種異步執行代碼的機制,不能并行執行任務。 在主隊列中,Main RunLoop直接配合任務的執行,負責處理UI事件、定時器以及其他內核相關事件。 RunLoop的主要目的: 保證程序執行的線程不會被系統終止。 什么時候使用Runloop ? 當需要和該線程進行交互的時候才會使用Runloop. 每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后去run它。 一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你在一個單獨的線程中需要長久的檢測某個事件。 主線程默認有Runloop。當自己啟動一個線程,如果只是用于處理單一的事件,則該線程在執行完之后就退出了。所以當我們需要讓該線程監聽某項事務時,就得讓線程一直不退出,runloop就是這么一個循環,沒有事件的時候,一直卡著,有事件來臨了,執行其對應的函數。 Runloop,正如其名所示,是線程進入和被線程用來響應事件以及調用事件處理函數的地方。需要在代碼中使用控制語句實現run loop的循環,也就是說,需要代碼提供while 或者 for循環來驅動run loop。 在這個循環中,使用一個Runloop對象[NSRunloop currentRunloop]執行接收消息,調用對應的處理函數。 Runloop接收兩種源事件:input sources和timer sources。 input sources 傳遞異步事件,通常是來自其他線程和不同的程序中的消息; timer sources(定時器) 傳遞同步事件(重復執行或者在特定時間上觸發)。 除了處理input sources,Runloop 也會產生一些關于本身行為的notificaiton。注冊成為Runloop的observer,可以接收到這些notification,做一些額外的處理。(使用CoreFoundation來成為runloop的observer)。 Runloop工作的特點: 1> 當有事件發生時,Runloop會根據具體的事件類型通知應用程序作出響應; 2> 當沒有事件發生時,Runloop會進入休眠狀態,從而達到省電的目的; 3> 當事件再次發生時,Runloop會被重新喚醒,處理事件。 提示:一般在開發中很少會主動創建Runloop,而通常會把事件添加到Runloop中。 |
|