在写这篇文章之前,对IOS中Runloop这概念的认知基本约等于0。从字面上的意思来了解,就是一个死循环的意思
直到我在网上看到这样一篇文章《深入了解Runloop》,初次阅读发现自己几乎无法理解文章中大部分词汇以及运作原理,直至反反复复阅读2~3遍才初探端倪
以下这篇文章,是通过自身略带抽象的思维方式结合自己的理解(或许也有问题),简述及整理上述的runloop文章。
1.什么是RUNLOOP
Runloop是一个对象,用于处理线程中任务、消息,并且提供了一个入口处理Event-Loop的逻辑。
那么又引出了一个新问题, Event-loop是什么?
WIKI上是这么说的:Event-Loop(事件循环)是一种编程结构类型,Event-Loop实际上是一个等待和调度的事件或信息的程序。是一个向某个内部或外部“event provider(事件发起者)”发送请求(通常作为阻碍直该事件到达)。并且调用<事件处理程序>"dispatches the event(调度事件)"。
实际上应该如何理解呢?
将Event-loop理解为信号灯,将程序理解为交通道路。为了阻止交通阻塞(程序运行线程过多)。常亮红灯用于阻挡某些道路避免拥堵(等待)。当被(事件处理程序)通知需要放行某方道路时自动转换为绿灯(调度)。
这里我们回到Runloop处,以上也可获知Runloop实际上基于OSX实现的Event-loop,同理也等于WINDOS的消息循环,node-js中的事件处理。
2.RUNLOOP与线程的关系
Runloop和线程是一一对应的,他们的关系是保存在同一个全局的Dictionary(字典)中。线程创建的时候并没有Runloop,并且不去获取Runloop,它并不会主动的创建。Runloop是在第一次获取当中创建,销毁于线程结束时。
3.RUNLOOP的接口
在CoreFoundation里runloop提供以下5个接口,简述其中作用为
CFRunloopRef:本质为Runloop
CFRunloopModelRef:内容为对外暴露,封装在runloopRef中,其对应关系下文有描述。
CFRunloopTimerRef:时间触发器
CFRunloopSourceRef:事件发生地
CFRunloopObserverRef:观察者
Runloop包含了多个Model对象,其中每个Model里包含着Timer、source、Observer三个对象。
Model与Model之间信息互不相通,并且要访问runloop中的其他model,必须退出当前线程,并且重新选定一个model再进入。这样能保证model与model之间的信息互不干预。
其中Timer、Source、Observer统称为 Model items 。这些items可以加入多个model,当一个items重复加入同一个model中是没有效果的。items中Timer、Source、Observer数据为空时,Runloop结束循环并退出。
4.RUNLOOP内部逻辑
当Runloop没有被以下4点影响而结束运作时,会不断的重复do-which循环
1.Timer超时
2.外部调用者强制停止
3.model items(Timer、source、observer)为空
4.进入loop时,参数说处理完事件后就返回。
5.总结
runloop是OSX的核心代码之一,几乎众多核心功能和业务中都将处理任务插入到runloop处理。以此打底作为对IOS编程知识面的补充是十分重要的。
作为一个名业务程序员,业务还算过得去,但是对于深层次代码是一窍不通的。以此为媒介继续往深专研一下,提升下自身代码水平吧。