runloop 理解

2019-12-11  本文已影响0人  kennths

runloop是什么 顾名思义 也就是字面理解的循环运行 但同时它也是一个对象,是一个结构体,能够给这个对象提供一个入口函数,当它运行这个入口函数后就会形成do..while循环,保证我们的应用程序不被退出。同时它也是消息处理模式

runloop 有什么用呢 

1.保持程序的持续运行

2.处理app中的各种事件(触摸,定时器,performselector)

block应用:__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__

调用timer:__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__

响应source0:__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__

响应source1: __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__

GCD主队列:__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__

observer源:__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__

3.节省cpu资源、提供程序的性能:该做事就做事,该休息就休息,虽然是do..while循环 但不是死循环

runloop与线程的关系

通过CFMutableDictionaryRef 字典  线程与runloop一一对应 通过key-value一一对应

变量--线程--runloop--timer 

子线程默认不开启runloop

timer依赖与runloop

关系图如下:

所以可以总结一下,CFRunloop通过CFMutableDictionaryRef与线程一一对应。CFRunloop是一个结构体struct,里面有集合CFRunloopMode,而CFRunloopMode下有CFRunloopSource集合,CFRunloopTimer集合,CFRunloopObserver集合 都是一对多的关系。但是CFRunloop同时只能在一个Mode下运行,是根据不同来临时切换的,比如有一个Timer在运行,这时的mode就是time的mode,而如果这时屏幕在滑动,就会切换

CFRunloopModel有五个分别是:

(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。

(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。

(3)UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。

(4)GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。

(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。

observer 监听runloop状态

CFRunLoopSource 是一个联合体,包含了source0和source1

source0    主要处理app内部事件,app自己负责管理的事务,比如点击屏幕(UIEVENT)。 回调函数指针(signal 待处理,wakeup唤醒runloop处理事件)

source1 match_port&函数回调指针 主要通过相应的port端口来传递消息 主要用来线程之间通讯比较少用

上一篇 下一篇

猜你喜欢

热点阅读