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)
案例:
3.xcode8的testcase已经支持了
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发消息
4.方便自己看
资料: