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