RunLoop

1.什么是RunLoop

相当于一个do-while循环的对象,在循环中处理各种事件来保持程序运行,没有事件处理时线程会休眠,在有事件时才会唤醒线程来处理,节省CPU资源,提高效率。

一个线程对应一个runloop对象,主线程的是系统创建,子线程的需要自己创建,在第一次获取runloop时创建,在线程结束时销毁。

runloop保存在一个全局的dictionary里,key是线程,value是runloop。

2.RunLoop Mode-运行模式

做不同的事情会切换到不同的mode来执行

NSDefaultRunLoopMode:默认运行mode,主线程一般在这个mode运行,当用户停止操作时候会在这个mode,没有任务执行了就会休眠。

UITrackingRunLoopMode:界面跟踪mode,用于scrollview追踪滑动,保证界面滑动时不受其他mode影响。

NSRunLoopCommonModes:占位mode,不是真正的运行mode,会同时处理默认mode和UImode的事件。

以上是实际开放的mode。

UIInitializationRunLoopMode:在刚启动时第一个mode,启动完就不再使用了。

GSEventReceiveRunLoopMode:接收系统事件的内部mode,通常用不到。

3.RunLoop Source-事件源/输入源

sources0:非基于mach_port的,一般为内部的事件,如触摸事件、selector事件。

sources1:基于mach_port的内核事件,可以由系统内核或者其他进程或者线程主动唤醒。

像点击屏幕,由source0进行接收,分发到souces1处理。

4.定时源:就是定时器,NSTimer

子线程定时器默认不开启,如果在子线程中执行需要手动开启runloop。

timerWithTimeInterval是不加入到loop中。

scheduledTimerWithTimeInterval会默认加到默认mode中。

在滑动scrollview时会触发UImode,需要将timer加入到UImode或者commonmode,才能触发。

5.RunLoop Observer-观察者

监听runloop的状态改变

6.RunLoop运行逻辑

7.RunLoop实际应用

a、autoreleasepool自动释放池

在主线程的runloop里注册了两个observer,即将进入(Entry)loop时创建_objc_autoreleasePoolPush(),优先级最高;在即将休眠(BeforeWaiting)时会释放旧池并创建新池_objc_autoreleasePoolPop()和_objc_autoreleasePoolPush(),即将退出(Exit)loop时会释放池子_objc_autoreleasePoolPop(),优先级最低。

b、更新UI

在mainloolp中即将休眠(BeforeWaiting)和即将退出(Exit)注册,会检查setNeedDisplay判断视图是否需要更新,所以更新UI需要在主线程中。

c、线程保活

NSCondition条件锁,当有任务时唤醒线程来处理。

利用runloop保活:

runloop开启方式:

d、监听优化系统卡顿

1)当runloop长时间停在kCFRunLoopBeforeSources,导致无法休眠,或者停在kCFRunLoopAfterWaiting,在唤醒后接受时间太长,就可以认为是卡顿。

2)注册观察者,并添加到主线程的commonmode中,观察runloop的所有状态,设置回调函数

3)设置信号量为0,如果<0则会阻塞当前线程,在子线程使用wait阻塞线程,并设置超时时间,超时会signal继续执行线程,或者收到主线程的消息,也会signal

4)当长时间被阻塞,查看是否在beforesources或者afterwaiting状态并且超时了,记为卡顿。

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

推荐阅读更多精彩内容

  • 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多...
    阳明先生_X自主阅读 1,101评论 0 17
  • 官方文档:Apple CoreFoundation源码RunLoop 文档(旧)NSRunLoopCFRunLoo...
    coder_my阅读 322评论 0 1
  • 最近看了很多RunLoop的文章,看完很懵逼,决心整理一下,文章中大部分内容都是引用大神们的,但好歹对自己有个交代...
    小凉介阅读 6,714评论 12 79
  • 苹果对runloop的使用 苹果在AutoreleasePool、手势识别、事件响应、UI更新、定时器、NSObj...
    进击的小杰阅读 425评论 0 0
  • 1、RunLoop初探 1.1、RunLoop是什么? RunLoop从字面上来说是跑圈的意思,如果这样理解不免有...
    风紧扯呼阅读 720评论 0 5