RunLoop是iOS开发过程中非常基础的一个概念,本文就简单说下RunLoop,也算是自己做的一个笔记,如有不对之处请指出。
RunLoop是什么?
我们都知道一个线程在执行完它的任务之后就会退出,那如果想要执行完任务不退出,下次有任务时线程还可以正常使用。这种模型称之为Event Loop。实现这种模型的关键就在于如何让它在有任务的时候处理任务,没有任务的时候进行休眠。
所以RunLoop就是一个对象,这个对象管理来需要处理的事件和消息。
如上图所示,RunLoop是由多个Mode组成,而每个Mode又分为若干个Source/Obsever/Timer组成。
每次启用RunLoop时只能指定一种Mode。如果需要切换只能退出RunLoop,然后重新启动指定一个Mode。
RunLoop的mode又哪些?
Mode一共分为5种,如下:
- NSDefaultRunLoopMode:默认的Mode,通常主线程在这个Mode下运行。
- UITrackingRunLoopMode:对应的是UI素材UIScrollView等UI控件滑动屏幕时对应的Mode。
- NSRunLoopCommonModes:这是一种标记,标记成为NSDefaultRunLoopMode和UITrackingRunLoopMode。
- UIInitializationRunLoopMode:这种是在APP启动时进入的第一个Mode,启动完成后就不会再进入了。
- GSEventReceiveRunLoopMode:接受系统内部事件的Mode,开发中用不到。
对于上面的5种Mode,后两种没有用到过。
RunLoop的简单应用
使用NSTimer时添加到runloop中
第一种,也是我们经常直接使用的。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
使用这种的话,相当于系统会自动添加到runloop中,并且对应的Mode为NSDefaultRunLoopMode,当我们滑动UIScrollView等控件时,定时器方法就不执行了。
第二种,自行添加到runloop中。
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
可以使用我们想要的Mode进行设置。