Runloop小结

作用:

Runloop的本质是线程的“经纪人”,专门给线程找事干。

是一个死循环,保持线程活着,有活干活,没活休眠。而不会让一个线程一个任务执行完了,马上释放掉。

Runloop里面维护了一个消息队列,用于存放线程要干的活。活分为很多种,也就是下面将要提到的事件源。

基于事件驱动的应用,都会有一个类似的runloop机制,这个区别于基于命令的程序。这套机制与平台无关,与业务机制相关。

创建:

主线程的runloop由系统创建,子线程的runloop的创建方式如下(参考AFNetworking)。

NSRunLoop*runLoop = [NSRunLoop currentRunLoop];

[runLoop addPort:[NSMachPortport]forMode:NSDefaultRunLoopMode];

[runLoop run];

Runloop能够接受的事件源:

1,NSTimer事件。CADisplayLink事件,类似timer的一种机制,屏幕每刷新一帧,触发一次执行。

2,UIEvent:iOS支持三种事件,触摸事件,运动事件,远程控制事件,通过source0触发。

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。回调事件在主线程的RunLoop中。

6,其他:autorelease对象释放,动画(CATransition,CAAnimation),NSPort,dispatch_get_main_queue()。

与runloop相关的类

Runloop起作用举例,如点击事件。

runloop调用堆栈


runloop处理事件的方法
runloop下面可以有几个mode,每个mode又可以有多个源
Source源

CFRunLoopSource:

Source0,app内部事件,如触摸事件等等

Source1,进程通信事件。

NSTimer----CFRunLoopTimer;


runloop的状态


autorelease对象释放


runloop mode特点



mode种类



scrollview滚动时runloop的切换



GCD与runloop的关系

GCD也有延迟执行的接口,这个延迟执行,据说跟Timer的机制不一样。只有GCD中在mainQueue中block的执行与RunLoop有关系。

performSelector是基于runLoop的,因此如果在子线程中,子线程没有开启runLoop,则调用方法不会生效。

GCD的延迟执行的函数,不是基于RunLoop的,因此不担心子线程调用的问题。

GCD里面延迟操作的逻辑,并不是基于Timer的。

Core Fundation部分开源的代码。

http://opensource.apple.com/source/CF/CF-855.14/

http://opensource.apple.com/source/CF/CF-855.17/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 一、什么是runloop 字面意思是“消息循环、运行循环”。它不是线程,但它和线程息息相关。一般来讲,一个线程一次...
    WeiHing阅读 8,111评论 11 111
  • ======================= 前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个...
    i憬铭阅读 871评论 0 4
  • 开启线程 分离主线程创建:创建线程后会自动执行,但是线程外部不可获取到该线程对象detachNewThreadWi...
    Mr_Pt阅读 1,058评论 0 1
  • 假装水彩的国画颜料 唉,我敷衍绘画,绘画也敷衍我了。 浪费了许多时间,笔触手感很不好。 一个人的时间用在哪里真的是...
    巫落阅读 171评论 0 1
  • (1)工资与回家 空先生月中收到了人生第一笔工资,开心得不得了。 开心完他严肃跟我说,“把我的工资卡跟你的支付宝绑...
    梨子的白日梦阅读 253评论 0 0