作用:
Runloop的本質(zhì)是線程的“經(jīng)紀人”技俐,專門給線程找事干。
是一個死循環(huán)统台,保持線程活著雕擂,有活干活,沒活休眠贱勃。而不會讓一個線程一個任務(wù)執(zhí)行完了井赌,馬上釋放掉。
Runloop里面維護了一個消息隊列贵扰,用于存放線程要干的活仇穗。活分為很多種拔鹰,也就是下面將要提到的事件源仪缸。
基于事件驅(qū)動的應(yīng)用,都會有一個類似的runloop機制列肢,這個區(qū)別于基于命令的程序恰画。這套機制與平臺無關(guān),與業(yè)務(wù)機制相關(guān)瓷马。
創(chuàng)建:
主線程的runloop由系統(tǒng)創(chuàng)建拴还,子線程的runloop的創(chuàng)建方式如下(參考AFNetworking)。
NSRunLoop*runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPortport]forMode:NSDefaultRunLoopMode];
[runLoop run];
Runloop能夠接受的事件源:
1,NSTimer事件欧聘。CADisplayLink事件片林,類似timer的一種機制,屏幕每刷新一幀怀骤,觸發(fā)一次執(zhí)行费封。
2,UIEvent:iOS支持三種事件,觸摸事件蒋伦,運動事件弓摘,遠程控制事件,通過source0觸發(fā)痕届。
3韧献,NSObject(NSDelayedPerforming)
----NSRunLoop.h
@interfaceNSObject (NSDelayedPerforming)?
- (void)performSelector:(SEL)aSelector withObject:(nullableid)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullableid)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullableid)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
@end
4,NSObject(NSThreadPerformAddition)
---NSThread.h
@interfaceNSObject (NSThreadPerformAdditions)
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait modes:(nullableNSArray *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait;
// equivalent to the first method with kCFRunLoopCommonModes
- (void)performSelector:(SEL)aSelector onThread:(NSThread*)thr withObject:(nullableid)arg waitUntilDone:(BOOL)wait modes:(nullableNSArray *)arrayNS_AVAILABLE(10_5,2_0);
- (void)performSelector:(SEL)aSelector onThread:(NSThread*)thr withObject:(nullableid)arg waitUntilDone:(BOOL)waitNS_AVAILABLE(10_5,2_0);
// equivalent to the first method with kCFRunLoopCommonModes
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullableid)argNS_AVAILABLE(10_5,2_0);
@end
5,NSUrlConnection研叫〈敢ぃ回調(diào)事件在主線程的RunLoop中。
6嚷炉,其他:autorelease對象釋放渊啰,動畫(CATransition,CAAnimation)申屹,NSPort虽抄,dispatch_get_main_queue()走搁。
Runloop起作用舉例独柑,如點擊事件迈窟。
CFRunLoopSource:
Source0,app內(nèi)部事件忌栅,如觸摸事件等等
Source1,進程通信事件车酣。
NSTimer----CFRunLoopTimer;
GCD也有延遲執(zhí)行的接口索绪,這個延遲執(zhí)行湖员,據(jù)說跟Timer的機制不一樣。只有GCD中在mainQueue中block的執(zhí)行與RunLoop有關(guān)系瑞驱。
performSelector是基于runLoop的娘摔,因此如果在子線程中,子線程沒有開啟runLoop唤反,則調(diào)用方法不會生效凳寺。
GCD的延遲執(zhí)行的函數(shù),不是基于RunLoop的彤侍,因此不擔心子線程調(diào)用的問題肠缨。
GCD里面延遲操作的邏輯,并不是基于Timer的盏阶。
Core Fundation部分開源的代碼晒奕。
http://opensource.apple.com/source/CF/CF-855.14/
http://opensource.apple.com/source/CF/CF-855.17/