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.
Runloop(方便自己记忆)_第1张图片
2.png

2.
Runloop(方便自己记忆)_第2张图片
3.png

3.xcode8的testcase已经支持了


Runloop(方便自己记忆)_第3张图片
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.
Runloop(方便自己记忆)_第4张图片
1.jpg

4.方便自己看
Runloop(方便自己记忆)_第5张图片
Runloop.png

资料:

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

你可能感兴趣的:(Runloop(方便自己记忆))