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