摘要
本文介紹iOS中的事件循環Runloop;

Runloop 是什么
- 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特性
當有事件發生時,Runloop會根據具體的事件類型通知應用程序作出響應;
當沒有事件發生時,Runloop會進入休眠狀態,從而達到省電的目的;
當事件再次發生時,Runloop會被重新喚醒,處理事件。
iOS 中所有的事件監聽全部由運行循環負責
主線程的 RunLoop在應用啟動的時候就會自動創建
其他線程則需要在該線程下自己啟動
不能自己創建 RunLoop
RunLoop 并不是線程安全的,所以需要避免在其他線程上調用當前線程的 RunLoop
RunLoop 負責管理
autorelease pools
RunLoop 負責處理消息事件,即輸入源事件、計時器事件和網絡請求事情
應用場景
-
創建常駐線程,執行一些會一直存在的任務。該線程的生命周期跟 App
相同
@autoreleasepool {
NSLog(@"%@", [NSThread currentThread]);
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 只有添加端口后,才能能夠保證運行循環持續運行
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];// 線程結束之前,不會執行至此 NSLog(@"%@", [NSThread currentThread]); }
維護線程的生命周期,讓線程不自動退出,
isFinished
為Yes
時退出在一定時間內監聽某種事件,或執行某種任務的線程
提示:一般在開發中很少會主動創建Runloop,而通常會把事件添加到Runloop中。