IOS —— Runloop 初识随笔

在写这篇文章之前,对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编程知识面的补充是十分重要的。

作为一个名业务程序员,业务还算过得去,但是对于深层次代码是一窍不通的。以此为媒介继续往深专研一下,提升下自身代码水平吧。

转载于:https://www.cnblogs.com/UUUUgua/p/9857750.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值