iOS多线程-【runLoop】
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