首页 > 技术文章 > iOS多线程-【runLoop】

gumengli 2019-01-24 16:32 原文

RunLoop简介

1.1什么是RunLoop?

RunLoop实际上是一个对象,这个对象在循环中用来处理程序运行过程中的各种事件(触摸事件、UI刷新事件、定时器时间、Selector事件)从而保持程序的持续运行

RunLoop在没有事件处理的时候,会使程序进入睡眠模式,从而节省CPU资源,提高程序性能。

 

1.2RunLoop和线程

RunLoop和线程是息息相关的,我们知道线程的作用是用来执行特定的一个或者多个任务,在默认情况下,显示成执行完之后聚会推出,就不能执行任务了。这时我们就需要炒菜用一种方式来让线程能够不断的处理任务,并不退出,这个时候就用到了RunLoop.

1.一条线程对应一个RunLoop对象,每条线程都有唯一一个与之对应的RunLoop对象。

2.RunLoop并不保证线程安全。我们只能在当前线程内部操作当前线程的RunLoop对象

3.RunLoop对象在第一次回去RunLoop时创建,销毁则是在线程结束的时候

4.主线程的RunLoop对象系统自动帮组我们创建好了,而子线程的RunLoopd对象需要我们主动创建和维护

 

1.3默认情况下主线程的RunLoop原理

 

从上图中可以看出,RunLoop 就是线程中的一个循环,RunLoop 会在循环中会不断检测,通过 Input sources(输入源)和 Timer sources(定时源)两种来源等待接受事件;然后对接受到的事件通知线程进行处理,并在没有事件的时候让线程进行休息。

2.RunLoop相关类 

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

     

接着来讲解这 5 个类的相互关系:

一个RunLoop对象(CFRunLoopRef)中包含若干个运行模式(CFRunLoopModeRef)。而每一个运行模式下又包含若干个输入源(CFRunLoopSourceRef)、定时源(CFRunLoopTimerRef)、观察者(CFRunLoopObserverRef)。

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

 

参考链接:https://www.jianshu.com/p/d260d18dd551

 

推荐阅读