線程和runloop是一一對應的, getcurrentRunloop 添加到線程中。
基本作用(需要性):【run loop是為了線程而生,沒有線程,它就沒有存在的必要。】
1) 保持程序的持續運行
2)處理app中的各種事情
(比如:觸摸事件、定時器事件、selector事件)
3)節省CPU資源,提供程序的性能
:該做事時做事,該休息的時候休息,這里的休息并不是runloop休息,而是runloop中的線程休息。
【也就是沒有對應的事情的時候,該線程就會進入休眠狀態;而該事情來的時候runloop就會觸發其內的對應的線程進行執行 【這種說法是錯誤的,應該是事件觸發runloop對象喚醒】】
(線程是通過獲取runloop對象的,也許是以為通過獲取的方法看如果有runloop對象就會喚醒了,若是沒有就會創建)
每個線程,包括程序的主線程(main thread)都有與之相應的run loop對象。
【這么說,runloop在程序中應該不是一個單例對象,是很多個對象】
runloop和線程的關系:主線程的run loop默認是啟動的
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
重點是UIApplicationMain()函數,這個方法會為main thread設置一個NSRunLoop對象。
對其它線程來說,run loop默認是沒有啟動的,如果你需要更多的線程交互則可以手動配置和啟動,如果線程只是去執行一個長時間的已確定的任務則不需要。
在任何一個Cocoa程序的線程中,都可以通過以下代碼來獲取到當前線程的run loop。
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
每個runloop運行的時候,都會檢測inputSource和timesource,檢測到輸入源,就會處理函數,首先是產生通知,corefunction 向線程添加runloop observers 來監聽事件,意在監聽事件發生時來做處理。
runloop上的工作模式: 同一個時刻只能夠運行一個模式,如果要運行另外一個模式,需要退出當前的模式,然后重新運行另外一個模式。
若是在當前的模式下運行,即為當前的model(mdoelref)的時候,只能夠處理當前模式下的source、observer、timer。
我們經常會使用到的是,創建一個定時器然后添加到當前的模式下面。
不過這個定時器不是非常精確,這個也是因為runloop的原因,因為runloop跑圈的時候不一定立馬就運行到。所以這里需要注意,若是需要非常精確地話,我們可以通過GCD的方式來進行實現。
(因為不能夠同時存在多種模式,所以,我們這里是可以通過一個模式的開始會影響著另外一個模式)
eg:一個具有拖拽的時候就會進入trace的模式下工作
NSRunLoopCommonModes模式下是在什么情況下都是可以運行的。
CADisPlayLink 也是添加到runloop中的,它是主動添加到runloop上的。
runloop的模式;
NSDefaultRunLoopMode ,App 默認是Mode ,通常主線程是在這個mode下運行的
NSTrackingRunLoopMode :界面跟蹤Mode,用于scrollView追蹤觸摸滑動,保證界面滑動的時候不受到其他Mode影響
NSInitializaitonRunLoopMode 接受系統時間的內涵Mode,通常不用
CSEventREceiceRunLoopMode :接受系統事件的內部Mode,通常用不到
NSRunLoopCommonMode:這是一個占位用的,不是一種真正的Mode
下面是使用例子:
@property (weak, nonatomic) IBOutlet DTSMobMessageView *adView;
廣告頁面中應該設置有 自動加載的屬性:autoLoad = on ;是一個可視化屬性,直接在界面上設置
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(run) userInfo:@{@"userInfo":@"用戶名字"} repeats:true];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
之所以可以循環就是NSTimer本身就是系統內部的timer的對象進行講解的。
所以這樣的東東應該增加到對應的runloop得快循環中。
http://www.cocoachina.com/ios/20160530/16498.html
1 runloop ——> 多個 runloop mode ---
1 runloop mode —— > 事件源、定時器、runloop observer
將線程添加到runloop對象里面,也就是runloop是對應線程的內容。runloop這個對象配置和關系對應線程的行為等等。
蘋果是利用 RunLoop 實現自動釋放池、延遲回調、觸摸事件、屏幕刷新等功能的。