ios Runloop 详细解析

        关于Run Loops看了很多大神文章,还是有点云里雾里,所以有时间感觉还是有必要从概念入手,仔细啃一遍官方文档。一起学习理解,有错误的地方请指正。

RunLoop-概念

      Run Loops是一个事件处理循环机制,用于整合处理接收到的事件,它是IOS与线程相关的基础架构的一部分。Run Loops的主要职责是当有事件需要处理的时候唤醒线程进行处理,反之使线程处于休眠状态。

      每个线程都有一个相关联的Run Loops对象,我们的程序不需要自己去创建。 Cocoa and Core Foundation都提供了相应的接口帮助我们配置以及管理与线程相关联的Run Loops,主线程的run loop是随着程序启动的时候已经自动配置和启动的,其他线程的runloop需要我们自己手动启用。CFRunLoop 是Core Foundation 库提供的runloop接口用C/C++实现的,是线程安全的,NSRunLoop是Foundation提供的接口用OC实现,是对CFRunLoop的封装,不是线程安全的,所以我们用NSRunLoop的对象处理runloop的时候需要避免在多线程处理。

RunLoop-原理

       Run Loops是一个循环,线程启动,借助runloop响应处理输入的事件,runloop的本质就是借助while或者for控制语句实现的,在循环里面我们使用run loop 的对象接收事件以及执行处理操作。

        Run Loops接收两种不同的事件源,Input sourcesTimer sources。Input sources发送异步事件,比如线程之间的通信或者APP之间的通信。Timer sources发送同步事件,比如在预定的时间发生的事件或者重复发生的事件。对于Input sources我们可以通过Core Foundation 框架提供的接口注册runloop的观察者,当runloop的行为发生改变我们可以收到通知,以此做一些需要的操作。runloop处理这两种事件源都是按照程序指定的流程处理,如图所示:

RunLoop-模式

       runloop模式是Input sourcesTimer sources事件集合以及注册观察runloop的观察者集合。我们运行runloop都需要指定对应的模式,当我们指定某种模式,只有该模式相关联的事件源会被监听并且允许其传递事件(类似的只有观察了对应模式的runloop才会收到,runloop的处理进度)。其他模式的事件源只能等待适合的模式才能向runloop传递事件。Core Foundation框架提供了五种模式(NSDefaultRunLoopModeNSConnectionReplyModeNSModalPanelRunLoopModeNSEventTrackingRunLoopModeNSRunLoopCommonModes),我们这里只介绍三种常用的,如果有需要下次再更新。

1.NSDefaultRunLoopMode:默认模式,大多数时候我们使用这个模式启动runloop和配置input sources,比如我们创建的定时器默认就是该模式。

2.NSEventTrackingRunLoopMode:字面意思就是事件追踪模式,该模式监听鼠标拖动(手指拖动)以及其他类型的用户交互追踪。比如当我们滑动表的时候就会触发该模式下的runloop。

3.NSRunLoopCommonModes:这个模式是一个常用模式的组合,在Foundation框架下该模式包含NSDefaultRunLoopMode和NSEventTrackingRunLoopMode,在Core Foundation下只包含NSDefaultRunLoopMode,我们可以使用CFRunLoopAddCommonMode函数将自定义模式添加到该集合。指定这种模式就相当于指定了该模式组合下的所有模式。

我们何时需要使用RunLoop?

   你可能用到runloop的地方是当你创建子线程的时候,但是并不是所有的子线程都需要开启runloop,比如你开始一个子线程执行一个复杂耗时的任务或者一个预先设定好的任务,此时我们都不需要开启runloop,很多时候runloop是用于线程间的通讯的。官方总结了以下几点我们会使用到runloop的地方:

1.当我们使用端口或者自定义的input sources与其他线程交互的时候。

2.在线程中使用定时器。

3.在程序中使用任何的performSelector… 方法。

4.让线程执行定期的任务

RunLoop使用注意事项

        开启runloop有三种方法,1.不加任何限制的开启,2设定一个限定时间,3.指定一种模式。一个runloop至少需要监视一个input source或者一个定时器,否则runloop会立即退出。第一种开启的方法是最简单的但是也是最不可取的,因为这种方法是不可控制。第二种方法和第三种方法可以混合使用,而且是比较推荐使用的。

       退出runloop有两种方式:1.当我们以限定时间开启一个runloop时,时间结束,runloop就会退出,2.手动停止,调用Core Foundation提供的CFRunLoopStop函数。虽然移除input source或者定时器会使runloop退出,但是很多时候,我们的代码不能正真的移除input source或者定时器,而这些会阻止runloop退出。

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

推荐阅读更多精彩内容

  • 翻译来源: RunLoops Run Loops RunLoops是与线程紧密相关的基础架构的一部分,简称运行循环...
    AlexCorleone阅读 566评论 0 1
  • Run Loops 下面会用一些陌生的或者容易让人混淆的字符,我们先来统一概念再继续,这样能够让你更加愉快的阅读:...
    董二千阅读 583评论 0 1
  • 什么是Run Loops RunLoops是与线程相关联的基础部分,一个Run Loop就是事件处理循环,他是用来...
    傻傻小萝卜阅读 961评论 0 5
  • 先贴下 apple doc, 本文基本是对照 doc 的翻译:https://developer.apple.co...
    brownfeng阅读 6,852评论 8 111
  • 醒来之后,便开始寻找。 你在屋子那个地方,心情瞬间失落。 想到你并不在身旁,可这感觉如此美妙! 却又让人感伤,开始...
    年少知无阅读 194评论 0 0