一、RunLoop是什么?
- 运行循环
- 是个结构体、是个对象,这个对象提供了一个入口函数
- 程序会进入 do..while循环
- 循环处理一些事情
二、Runloop的作用
- 保持程序的持续运行
- 处理APP中的各种事件(触摸、定时器、performSelector)
- 节省cpu资源、提高程序的性能; 该做事就做事,该休息就休息。类似如下代码
int main(int argc, const char * argv[]) {
@autoreleasepool {
while (1) {
NSLog(@"hello");
static int a = 0;
if (a == 50000) {
sleep(30);
}
NSLog(@"======%d======",a);
a += 1;
}
}
return 0;
}
- 保证线程不退出。
- 负责监听所有的事件(iOS中的触摸、时钟、网络事件)
- RunLoop负责绘制UI
三、Runloop的item
- 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__
RunLoop 处理的事件
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__();
static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__();
static void __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__();
static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__();
static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__();
static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__();
四、runloop与线程的关系
Runloop:线程.png- 一一对应关系, 通过一个全局可变CFMutableDictionaryRef(就是key-value)
- runloop的创建, __CFRunLoopCreate(pthread_main_thread_np())
- runloop 存储, CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);
- runloop 获取, CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t))
- 线程 -- runloop -- timer
- 子线程runloop 默认不开启
- timer 依赖于runloop
Runloop结构.png
-
NSDefaultRunLoopMode
:App默认mode,通常主线程在这个mode下运行 -
UITrackingRunLoopMode
:界面跟踪mode,用于ScrollView跟踪触摸滑动,保证滑动时不受其他mode影响 -
NSRunLoopCommonModes
:占位用的mode,不是一个真正的mode,相当于NSDefaultRunLoopMode
+UITrackingRunLoopMode
-
UIInitializationRunLoopMode
(系统初始化模式):刚启动App时进入的第一个mode,启动完成之后不再使用 -
GSEventReceiveRunLoopMode
(系统内核模式):接受系统事件的内部mode,通常用不到
RunLoop的结构.png
RunLoop的原理.png
网友评论