iOS RunLoop的理解

1. RunLoop理解

  • RunLoop 就是线程中的一个循环,RunLoop 会在循环中会不断检测,通过 Input sources(输入源)和 Timer sources(定时源)两种来源等待接受事件;然后对接受到的事件通知线程进行处理,并在没有事件的时候让线程进行休息。
  • RunLoop 实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行。
  • RunLoop 在没有事件处理的时候,会使线程进入睡眠模式,从而节省 CPU 资源,提高程序性能。

2.RunLoop 和线程

  • 一条线程对应一个RunLoop对象,每条线程都有唯一一个与之对应的 RunLoop 对象。
  • RunLoop 并不保证线程安全。我们只能在当前线程内部操作当前线程的 RunLoop 对象,而不能在当前线程内部去操作其他线程的 RunLoop 对象方法。
  • RunLoop 对象在第一次获取 RunLoop 时创建,销毁则是在线程结束的时候。
  • 主线程的 RunLoop 对象系统自动帮助我们创建好了,而子线程的 RunLoop对象需要我们主动创建和维护。

3. RunLoop的相关类

  • CFRunLoopRef:代表 RunLoop 的对象
  • CFRunLoopModeRef:代表 RunLoop 的运行模式
  • CFRunLoopSourceRef:就是 RunLoop 模型图中提到的输入源 / 事件源
  • CFRunLoopTimerRef:就是 RunLoop 模型图中提到的定时源
  • CFRunLoopObserverRef:观察者,能够监听 RunLoop 的状态改变

一个RunLoop对象(CFRunLoopRef)中包含若干个运行模式(CFRunLoopModeRef)。而每一个运行模式下又包含若干个输入源(CFRunLoopSourceRef)、定时源(CFRunLoopTimerRef)、观察者(CFRunLoopObserverRef)。
每次 RunLoop 启动时,只能指定其中一个运行模式(CFRunLoopModeRef),这个运行模式(CFRunLoopModeRef)被称作当前运行模式(CurrentMode)。
如果需要切换运行模式(CFRunLoopModeRef),只能退出当前 Loop,再重新指定一个运行模式(CFRunLoopModeRef)进入。
这样做主要是为了分隔开不同组的输入源(CFRunLoopSourceRef)、定时源(CFRunLoopTimerRef)、观察者(CFRunLoopObserverRef),让其互不影响 。

  • 系统默认注册了5个Mode常用的有3个:
    1.kCFRynLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
    2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
    3.kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode
    4.UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后不再使用
    5.GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到

你可能感兴趣的:(iOS RunLoop的理解)