RunLoop初谈

RunLoop是iOS开发过程中非常基础的一个概念,本文就简单说下RunLoop,也算是自己做的一个笔记,如有不对之处请指出。

RunLoop是什么?

我们都知道一个线程在执行完它的任务之后就会退出,那如果想要执行完任务不退出,下次有任务时线程还可以正常使用。这种模型称之为Event Loop。实现这种模型的关键就在于如何让它在有任务的时候处理任务,没有任务的时候进行休眠。

所以RunLoop就是一个对象,这个对象管理来需要处理的事件和消息。

RunLoop_0.png

如上图所示,RunLoop是由多个Mode组成,而每个Mode又分为若干个Source/Obsever/Timer组成。
每次启用RunLoop时只能指定一种Mode。如果需要切换只能退出RunLoop,然后重新启动指定一个Mode。

RunLoop的mode又哪些?

Mode一共分为5种,如下:

  1. NSDefaultRunLoopMode:默认的Mode,通常主线程在这个Mode下运行。
  2. UITrackingRunLoopMode:对应的是UI素材UIScrollView等UI控件滑动屏幕时对应的Mode。
  3. NSRunLoopCommonModes:这是一种标记,标记成为NSDefaultRunLoopMode和UITrackingRunLoopMode。
  4. UIInitializationRunLoopMode:这种是在APP启动时进入的第一个Mode,启动完成后就不会再进入了。
  5. 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进行设置。

你可能感兴趣的:(RunLoop初谈)