線程和runloop是一一對應(yīng)的, getcurrentRunloop 添加到線程中。
基本作用(需要性):【run loop是為了線程而生,沒有線程,它就沒有存在的必要?!?br>
1) 保持程序的持續(xù)運行
2)處理app中的各種事情(比如:觸摸事件、定時器事件、selector事件)
3)節(jié)省CPU資源,提供程序的性能:該做事時做事,該休息的時候休息,這里的休息并不是runloop休息,而是runloop中的線程休息。
【也就是沒有對應(yīng)的事情的時候,該線程就會進(jìn)入休眠狀態(tài);而該事情來的時候runloop就會觸發(fā)其內(nèi)的對應(yīng)的線程進(jìn)行執(zhí)行 【這種說法是錯誤的,應(yīng)該是事件觸發(fā)runloop對象喚醒】】
(線程是通過獲取runloop對象的,也許是以為通過獲取的方法看如果有runloop對象就會喚醒了,若是沒有就會創(chuàng)建)
每個線程,包括程序的主線程(main thread)都有與之相應(yīng)的run loop對象。
【這么說,runloop在程序中應(yīng)該不是一個單例對象,是很多個對象】
runloop和線程的關(guān)系:主線程的run loop默認(rèn)是啟動的
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
重點是UIApplicationMain()函數(shù),這個方法會為main thread設(shè)置一個NSRunLoop對象。
對其它線程來說,run loop默認(rèn)是沒有啟動的,如果你需要更多的線程交互則可以手動配置和啟動,如果線程只是去執(zhí)行一個長時間的已確定的任務(wù)則不需要。
在任何一個Cocoa程序的線程中,都可以通過以下代碼來獲取到當(dāng)前線程的run loop。
NSRunLoop *runloop = [NSRunLoop currentRunLoop];

每個runloop運行的時候,都會檢測inputSource和timesource,檢測到輸入源,就會處理函數(shù),首先是產(chǎn)生通知,corefunction 向線程添加runloop observers 來監(jiān)聽事件,意在監(jiān)聽事件發(fā)生時來做處理。
runloop上的工作模式: 同一個時刻只能夠運行一個模式,如果要運行另外一個模式,需要退出當(dāng)前的模式,然后重新運行另外一個模式。

若是在當(dāng)前的模式下運行,即為當(dāng)前的model(mdoelref)的時候,只能夠處理當(dāng)前模式下的source、observer、timer。

我們經(jīng)常會使用到的是,創(chuàng)建一個定時器然后添加到當(dāng)前的模式下面。

不過這個定時器不是非常精確,這個也是因為runloop的原因,因為runloop跑圈的時候不一定立馬就運行到。所以這里需要注意,若是需要非常精確地話,我們可以通過GCD的方式來進(jìn)行實現(xiàn)。
(因為不能夠同時存在多種模式,所以,我們這里是可以通過一個模式的開始會影響著另外一個模式)
eg:一個具有拖拽的時候就會進(jìn)入trace的模式下工作

NSRunLoopCommonModes模式下是在什么情況下都是可以運行的。
CADisPlayLink 也是添加到runloop中的,它是主動添加到runloop上的。
runloop的模式;
NSDefaultRunLoopMode ,App 默認(rèn)是Mode ,通常主線程是在這個mode下運行的
NSTrackingRunLoopMode :界面跟蹤Mode,用于scrollView追蹤觸摸滑動,保證界面滑動的時候不受到其他Mode影響
NSInitializaitonRunLoopMode 接受系統(tǒng)時間的內(nèi)涵Mode,通常不用
CSEventREceiceRunLoopMode :接受系統(tǒng)事件的內(nèi)部Mode,通常用不到
NSRunLoopCommonMode:這是一個占位用的,不是一種真正的Mode
下面是使用例子:
@property (weak, nonatomic) IBOutlet DTSMobMessageView *adView;
廣告頁面中應(yīng)該設(shè)置有 自動加載的屬性:autoLoad = on ;是一個可視化屬性,直接在界面上設(shè)置
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(run) userInfo:@{@"userInfo":@"用戶名字"} repeats:true];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
之所以可以循環(huán)就是NSTimer本身就是系統(tǒng)內(nèi)部的timer的對象進(jìn)行講解的。
所以這樣的東東應(yīng)該增加到對應(yīng)的runloop得快循環(huán)中。
http://www.cocoachina.com/ios/20160530/16498.html
1 runloop ——> 多個 runloop mode ---
1 runloop mode —— > 事件源、定時器、runloop observer

將線程添加到runloop對象里面,也就是runloop是對應(yīng)線程的內(nèi)容。runloop這個對象配置和關(guān)系對應(yīng)線程的行為等等。
蘋果是利用 RunLoop 實現(xiàn)自動釋放池、延遲回調(diào)、觸摸事件、屏幕刷新等功能的。

