Runloop(方便自己记忆)

Runloop的主要作用

1.整个app是由一个大的runloop包起来,使程序一直运行并接受用户输入
2.平时休息,当有event来临时,决定程序在何时处理哪些event
3.使用(message queue)调用解耦,比如:用户滑动scrollview,会产生很多events,runloop把这些events扔到message queue,在合适的时候处理,试想一下,如果是立即处理,那么用户一滑动屏幕,event太多,可能屏幕就卡住了
4.节省cpu时间,cpu处理event是时间片轮转调度的方式,而runloop就是把一段时间的事件全部收集起来执行,提高了cpu处理的效率。
举个栗子:我们同时打开多个app,看到的现象是同时运行在运行;但是在微观上,程序是被操作系统片段执行的,每个片段就是一个时间片(由于只有一个CPU,一次只能处理程序要求的一部分,除开新的多核CPU以及超线程CPU)

案例:

1.
2.png

2.
3.png

3.xcode8的testcase已经支持了


4.png

4.当你需要固定间隔比如0.1秒统计等操作时,因为主线程要做UI等操作可能导致导致回调事件不准确(Timer 有个属性叫做 Tolerance (宽容度),标示了当时间点到后,容许有多少最大误差)。
这个时候你可以把timer加到commonRunloop里面;
同样也可以加到子线程避免这种情况:

   dispatch_async(dispatch_get_global_queue(0, 0), ^{
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aaa) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });

注意事项:

1.getCurrentRunloop获取当前的runloop,没有则会创建一个
2.AFNetworking中的runloop添加machport,只是为了让runloop活着,因为这个runloop会一直等待port发消息

3.
1.jpg

4.方便自己看
Runloop.png

资料:

深入理解RunLoop
孙源的runloop视频
iOS - RunLoop 深入理解
时间片轮转调度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先贴下 apple doc, 本文基本是对照 doc 的翻译:https://developer.apple.co...
    brownfeng阅读 6,918评论 8 111
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 1,230评论 0 7
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,848评论 3 63
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大饼炒鸡蛋阅读 1,181评论 0 6
  • 她的妹妹不顾阻拦冲进王府,剑尖指向她的心口,”你这么做,可对得起姐姐?“ 姐姐刚刚过世,他便娶了三位小妾进门。 他...
    秭颜阅读 393评论 0 1