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
关系图如下:
![](https://img.haomeiwen.com/i5013834/a146a0ee7c1fe7ac.png)
所以可以总结一下,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端口来传递消息 主要用来线程之间通讯比较少用
![](https://img.haomeiwen.com/i5013834/c4e7bd24eb7228dd.png)
网友评论