iOS RunLoop

iOS RunLoop

zh_iOS

发布时间:2016/03/20 10:21

阅读:68

收藏:2

点赞:2

评论:6

什么是RunLoop?RunLoop到底有多神秘,多神奇,    RunLoop是怎么工作的,有什么用,今天就来带大家简略的刨根问底一下。

当一个App启动,如果我们不做任何交互操作,那么App默认不会做任何响应,一旦我们触摸了屏幕,或点击了某个按钮,程序就立即做出相应的响应,给我们的操作一个反馈。

仿佛这个app是处于一个时刻准备着的状态,没人干活的时候就休息,有人操作了就做出响应,这一切终究归于一个叫RunLoop的东西。Run -> 运行,Loop -> 循环,RunLoop就是一个运行循环。那什么才是运行循环呢?在iOS中RunLoop又充当一个什么样的角色呢?

其实在App中,所有的事件响应都由运行循环来派发和调度,当用户没有任何操作时,运行循环处于休眠状态,一旦用户点击了,或者触摸了屏幕某个地方,运行循环会立即苏醒,来找到最佳响应者(这里涉及到响应者链条,后续会继续说明),然后处理这个事件。

优点:

因为有了运行循环的存才,不需要app一直除以活跃状态,一切由RunLoop来监管,这样大大节省了系统资源。

RunLoop与线程的关系:

程序启动会后,会执行main方法,设置AppDelegate,并且会为主线程设置RunLoop并默认启动,这就是为什么程序启动,就能响应操作的原因。

而当我们开启子线程的时候,子线程的运行循环默认不开启,这是因为除了主线程以外,并不是线程开的越多越好,当子线程工作完成,出于一个空闲状态时,这个线程会被底层线程池回收,而如果子线程的RunLoop默认是开启的,那么这个子线程永远释放不掉,反而导致性能下降,所以,为什么主线程的运行循环默认启动,而子线程的运行循环默认不启动,大家应该能够了解了。

RunLoop内部:挂一张任何帖子都看得到的图

RunLoop内部有一个输入源(input sources),一个定时源(Timer sources)

1. 输入源:传递异步事件,消息通常来自与其他线程,处理其他线程的消息,比如:下载操作执行完毕,要回到主线程个更新UI,这些异步事件,就是有RunLoop来监听和管理

2. 定时源:传递同步事件,发生在特定时间,或者时间间隔,比如:定时检查UI界面上有没有刷新事件,点击时间等等,也就是处理本线程上的事件

运行循环共有5总模式:

1. NSDefaultRunLoopMode:是RunLoop默认的模式,表示程序空闲。如果我们用NSTimer来每个一秒钟打印输出的时候,一旦有手势操作(例如滑动,滚动操作),那么NSTimer就会停止打印。所以这是RunLoop默认的模式。

2. UITrackingRunLoopMode:跟踪模式(是ScrollView专用的模式),上面第一条所说的,一旦有滚动,滑动类似的操作,RunLoop就会默认由NSDefaultRunLoopMode模式切换到UITrackingRunLoopMode模式,目的就是为了保证滑动的流畅性,给用户提供流畅的体验。

3. NSRunLoopCommonMode:这种模式会包含以上两种模式,我们滑动操作的同时,NSTimer时钟调用的方法也会被执行(也会打印出来结果),但是,一旦所调用的方法中,有耗时操作,当我们再次滑动时,效果简直卡到爆。

所以,再实际开发中,不建议讲RunLoop的模式更改为NSRunLoopCommonMode。

但是,有的需求就是又要做耗时操作,又想有流畅滑动效果,那么OK,将耗时操作放在后台,将时钟操作放在子线程(注意:子线程RunLoop需要手动开启:CFRunLoopRun(),CFRunLoopStop(CFRunLoopCurrent())停止运行循环);

4. UIInitializationRunLoopMode:在程序刚刚启动时进入的第一个模式,启动完成就不再使用。

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

RunLoop应用场景:

1. 滑动与刷新

2. 常驻子线程

保持子线程长期运转而不被销毁,可以在子线程手动开启RunLoop

3. NSURLConnection的下载

NSURLConnection的下载操作默认是在主线程的(所有早就了ASI与AFN框架,iOS主推NSURLSession),为了不影响主线程UI操作,将下载任务放在子线程,就需要手动开启RunLoop

原文地址:http://www.cocoachina.com/bbs/read.php?tid-1484418.html

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

推荐阅读更多精彩内容