Runloop运行状态分析

1、先来一张图看下runloop 的运行流程:

Runloop 运行状态图分析

2、具体描述:RunLoop内部的基本流程

(1)通知观察者RunLoop启动
(2)通知观察者即将处理Timer
(3)通知观察者即将处理Source0
(4)触发Source0回调
(5)如果有Source1(基于port)处于ready状态,直接处理该Source1然后跳转到 第(9)步去处理消息
(6)如果没有待处理消息,则通知观察者RunLoop所在线程即将进入休眠。
(7)休眠前,RunLoop会添加一个dispatchPort,底层调用mach_ msg接收mach_ port的消息。线程进入休眠,直到下面某个事件触发唤醒线程:

  • 基于port的Source1事件到达
  • Timer时间到达
  • RunLoop启动时设置的最大超时时间到了
  • 手动唤醒

(8)唤醒后,将休眠前添加的dispatchPort移除,并通知观察者RunLoop已经被唤醒
(9)通过handle_ msg处理消息
(10)如果消息是Timer类型,则触发该Timer的回调
(11)如果消息是dispatch到main_ queue的block,执行block
(12)如果消息是Source1类型,则处理Source1回调
(13)以下条件中满足时候退出循环,否则从(2)继续循环

  • 事件处理完毕而且启动RunLoop的时候参数设置为一次性执行
  • 启动RunLoop时设置的最大运行时间到期
  • RunLoop被外部调用强行停止
  • 启动RunLoop的mode items为空

(14)上一步退出循环后退出RunLoop,通知观察者RunLoop退出

3、重点强调:

Runloop被唤醒后,一定是:先处理唤醒它的事件,处理完后再检查是否满足退出的条件,满足则退出Runloop,不满足才重新回到步骤(2)去循环
可以断点验证:唤醒后先处理唤醒runloop的时间,之后才会走到步骤2的结论。

4、Runloop 的源

  • Source0 :只包含一个函数指针(回调方法),不能自动触发,只能手动触发,触发方式是先通过CFRunLoopSourceSignal(source)将这个Source标记为待处理,然后再调用CFRunLoopWakeUp(runloop) 来唤醒RunLoop处理这个事件。

  • Source1 :基于port的Source源,包含一个port和一个函数指针(回调方法)。该Source源可通过内核和其他线程相互发送消息,而且可以主动唤醒RunLoop。

问题:

UI刷新是划分为Source1事件,而事件响应属于source0。笔者暂时这样理解:因为UI刷新是主动进行的,不需要外部手动触发。而事件响应(例如:touch事件的触发)等需要外部手动触发。鉴于是否可以手动触发以及来自消息来内核等知识点,故将UI刷新划分为Source1事件,而事件响应划分为source0。
如果理解有误,或者有更具说服力的理解,请及时联系笔者。

解决:笔者通过查阅core animation相关文档和资料,找到以下合理依据:

RunLoop任务分发

iOS 显示系统原理图

iOS 的显示系统是由 VSync 信号驱动的,VSync 信号由硬件时钟生成,每秒钟发出 60 次(这个值取决设备硬件,比如 iPhone 真机上通常是 59.97)。iOS 图形服务接收到 VSync 信号后,会通过 IPC 通知到 App 内。App 的 Runloop 在启动后会注册对应的 CFRunLoopSource 通过 mach_port 接收传过来的时钟信号通知,随后 Source 的回调会驱动整个 App 的动画与显示。

Core Animation 在 RunLoop 中注册了一个 Observer,监听了 BeforeWaiting 和 Exit 事件。这个 Observer 的优先级是 2000000,低于常见的其他 Observer。当一个触摸事件到来时,RunLoop 被唤醒,App 中的代码会执行一些操作,比如创建和调整视图层级、设置 UIView 的 frame、修改 CALayer 的透明度、为视图添加一个动画;这些操作最终都会被 CALayer 捕获,并通过 CATransaction 提交到一个中间状态去(CATransaction 的文档略有提到这些内容,但并不完整)。当上面所有操作结束后,RunLoop 即将进入休眠(或者退出)时,关注该事件的 Observer 都会得到通知。这时 CA 注册的那个 Observer 就会在回调中,把所有的中间状态合并提交到 GPU 去显示;如果此处有动画,CA 会通过 DisplayLink 等机制多次触发相关流程。

5、参阅

Runloop机制探索
iOS保持界面流畅技巧

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

推荐阅读更多精彩内容

  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 975评论 0 4
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨阅读 828评论 0 3
  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 1,435评论 0 13
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大饼炒鸡蛋阅读 1,146评论 0 6
  • 插上耳机,精心聆听。旅途带来的沿途风景真真的很治愈。 青山绿水,小溪流水!不觉中更加向往这样的生活。
    七素_阅读 115评论 0 0