浅谈RunLoop

由于各种原因,需要对RunLoop进行研究,通过阅读大神的文章对RunLoop也有了一些了解,在这里进行下小结。

RunLoop的概念

首先说下Event Loop模型。一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。让线程能随时处理事件但并不退出,这种机制就是Event Loop。在iOS中的RunLoop就是这个模型的应用。RunLoop用来管理事件/消息,如何让线程在没有处理消息的时候休眠以避免资源占用,在消息到来时立刻被唤醒。RunLoop通过提供的入口函数来执行上面的EventLoop的逻辑。线程执行了这个函数后,就会一直处于这个函数内部"接受消息->等待->处理" 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回。

RunLoop与线程的关系

线程和RunLoop是一一对应的,即每个线程都有个对应的RunLoop。它们是键值对关系,保持在一个全局字典里。RunLoop不可以直接创建,但是可以通过CFRunLoopGetMain() 和 CFRunLoopGetCurrent()两个自动获取函数获取。调用CFRunLoopGetMain()方法,第一次进来时,系统会初始化全局的字典,并先为主线程创建一个RunLoop  。然后从字典里获取loop然后返回。调用CFRunLoopGetCurrent()方法时会直接从字典里获取,如果获取不到,系统会地动创建一个,同时注册一个回调,当线程销毁时,顺便销毁其对应的RunLoop。然后返回loop。总的来说,线程刚创建的时候是没有RunLoop,只有自动去获取才会创建,创建后会在线程结束时销毁。你只能在一个线程的内部获取其RunLoop(主线程除外)。

RunLoop的对外接口和内部结构

在 CoreFoundation 里面关于 RunLoop 有5个类:

CFRunLoopRef、CFRunLoopModeRef、CFRunLoopSourceRef、CFRunLoopTimerRef、CFRunLoopObserverRef

他们的关系如下:


一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。

RunLoop的Mode有5个成员,Mode的name、Source0、Source1、Observers、Timer。

RunLoop内部逻辑:


Observer监听事件,回调需要处理的事件。其中有三种方式的回调,通过Source0回调,通过Timer定时器回调,外部手动唤醒。Source0不能主动触发事件,需要把它标记为待处理,然后手动唤醒RunLoop。Source1与之相反(Source1能主动唤醒RunLoop的线程,被用于通过内核和其他线程相互发消息)。

Timer(CFRunLoopTimerRef)时间触发器,其包含一个时间长度和一个回调(函数指针)。当其加入到RunLoop时,RunLoop会注册对应的世界点,当时间点到时,RunLoop会被唤醒以执行这个回调。

观察者(CFRunLoopObserverRef)Observer,每个Observer都包含一个回调,当RunLoop状态发生变化时,观察者就能通过回调接受到这个变化。时间点有6个:即将进入RunLoop、即将处理Timer、即将处理Source、即进入休眠,刚从休眠中唤醒,即将推出RunLoop。

具体流程:

首先根据ModeName找到对应的mode,如果mode里没有source、timer、obsever就直接返回。1.通知Observer即将进入loop。2.通知Observer即将触发Source0回调。4.触发Source0的回调。5.如果有Source1,直接处理然后跳转去处理消息。6.通知Observer即将进入休眠。7.线程进入休眠,直到被唤醒。8.通知Observer线程被唤醒了。9.收到消息,处理消息。10.通知Observer即将退出RunLoop。

RunLoop在iOS中的应用

这里只是列举出应用:

1.自动释放池(AutoreleasePool)  2.事件响应 3.手势识别  4.界面更新 5.定时器  6.网络请求(AFNetworking)。

总结

大部分都是借鉴这位大神的话,因为自己对RunLoop的理解也只是在字面上。基本上也明白了RunLoop是什么。有错误欢迎大家指出!

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

推荐阅读更多精彩内容

  • 转载自深入理解RunLoop 一、RunLoop概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退...
    夏天的风_song阅读 378评论 0 0
  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 1,436评论 0 13
  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 976评论 0 4
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大饼炒鸡蛋阅读 1,152评论 0 6
  • 书写是一种能力,持续练习可以找到人生困惑的解答,回归内心深处的平静。舒缓郁闷心情、化解人际困境、破除生死两难、书写...
    弈臻阅读 76评论 0 0