1.淺談RunLoop
runLoop從字面的意思上看是運行中的循環(huán)驻呐,作用是保持APP的持續(xù)運行,處理APP的各種事件絮宁,比如點擊事件、定時器事件服协、Selector事件绍昂,節(jié)省CPU資源,提高APP的性能偿荷,能夠讓線程在有工作的時候忙碌窘游,在沒有工作的時候休眠
2.RunLoop和線程的關(guān)系
1.runLoop和線程是緊密關(guān)聯(lián)的,可以說是為了線程而生跳纳,沒有線程忍饰,runLoop也沒存在的必要。
2.runLoop和線程是一一對應(yīng)的棒旗,主線程的runLoop默認(rèn)是創(chuàng)建的喘批,子線程的需要手動創(chuàng)建。currentRunLoop懶加載的,在同一個子線程中創(chuàng)建多個runloop铣揉,則返回的都是同一個對象饶深,因為其是懶加載模式的
? ? ? 獲得主線程的runLoop:NSRunLoop *mainRunLoop =[NSRunLoop mainRunLoop];
? ? ? 獲得當(dāng)前線程runLoop:NSRunLoop *currentRunLoop =[NSRunLoop currentRunLoop];
3.在runloop中有多個運行模式,但是runloop只能選擇一種模式運行,mode里面至少要有一個timer或者是source
4.在第一次獲取時創(chuàng)建逛拱,在線程結(jié)束時銷毀
3.RunLoop的幾個類
1.CFRunLoopRef:NSRunLoop對象是OC對象敌厘,是對CFRunLoopRef的封裝,可以通過getCFRunLoop方法獲取其對應(yīng)的CFRunLoopRef對象朽合。注意俱两,NSRunLoop不是線程安全的,但CFRunLoopRef是線程安全的
2.RunLoopMode:NSRunLoop對象是一系列RunLoopMode的集合,每個mode包括有這個模式下所有的Source源曹步、Timer源和觀察者宪彩。每次RunLoop調(diào)用的時候都只能調(diào)用其中的一個mode,接收這個mode下的源讲婚,通知這個mode下的觀察者尿孔。這樣設(shè)計的主要目的就是為了隔離各個模式下的源和觀察者,使其不相互影響筹麸,常用的五種模式:
?kCFRunLoopDefaultMode:App默認(rèn)的mode活合,一般情況下App都是運行在這個mode ?下的
?UITrackingRunLoopMode:界面跟蹤時的mode,一般用于ScrollView滾動的時候追 蹤的物赶,保證滑動的時候不受其他事件影響
UIInitializationRunLoopMode:在剛啟動 App 時第進入的第一個 Mode白指,啟動完成后就不再使用
GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部 Mode,一般用不到
kCFRunLoopCommonModes:占位mode酵紫,可以向其中添加其他mode用以檢測多個mode的事件
3.CFRunLoopSourceRef:事件源產(chǎn)生的地方
4.CFRunLoopTimerRef:是基于事件的觸發(fā)器告嘲,其中包含一段時間長度、延期容忍度和一個函數(shù)指針(回調(diào)方法)奖地。當(dāng)其加入到RunLoop中時状蜗,RunLoop會注冊一個時間點,當(dāng)?shù)竭_這個時間點后鹉动,會觸發(fā)對應(yīng)的事件轧坎。
5.CFRunLoopObserverRef:RunLoop的觀察者。每個觀察者都可以觀察RunLoop在某個模式下事件的觸發(fā)并處理
kCFRunLoopEntry:即將進入runLoop
kCFRunLoopBeforeTimers:即將處理Timer
kCFRunLoopBeforeSources:即將處理Source
kCFRunLoopBeforeWaiting:即將進入休眠
kCFRunLoopAfterWaiting:剛從休眠中被喚醒
kCFRunLoopExit:即將退出RunLoop
4.NSTimer在RunLoop中的使用
方式一:
方式二:
5.RunLoop常駐線程
注意事項:當(dāng)進入block的時候泽示,先創(chuàng)建了timer缸血,并且也把timer也把timer加入到runloop中,但是很重要的一點子線程中Runloop不會自動運行械筛,需要手動運行捎泻,因為這里沒有運行Runloop,所以timer就被釋放掉了埋哟,所以導(dǎo)致了啥都沒有笆豁。
小知識:[[NSRunLoop currentRunLoop] run]郎汪,運行runloop,
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];指定runloop在指定模式下闯狱,設(shè)置開始時間,開啟成功會返回YES
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
運行runloop直到一個時間