iOS runloop
2021-07-25 本文已影响0人
宗驭
什么是runloop
运行循环, 在程序运行过程中循环做一些事情, 类似一个圈 do while
没有runloop的话,程序执行完就直接退出了. 例如一个.m文件的编译,编译完毕如果没有while的类似循环则会打印 ....with exit code: 0 退出 程序.
作用:
1.有了它就会保持程序的持续运行
2.处理App中的各种事件
3.节省CPU资源,提高程序性能. 该做事做事,该休息休息
获取runloop对象
NSRunLoop *runloop = [NSRunLoop currentRunLoop]; //获取 当前线程的runloop
NSRunLoop *runloop = [NSRunLoop mainRunLoop];//获取主线程的runloop
runloop 和 线程之间的关系
1:每条线程都有与之对应的runloop对象
2: runloop 保存在全局的Dictionary里, 线程作为key, runloop 为value 类似: runloops[线程] = runloop
3: 线程刚创建的时候并没有runloop 对象, runloop 会在第一次获取它的时候创建
image.png
4:runloop 会在线程结束的时候销毁
5:主线程的runloop已经自动创建, 子线程默认没有开启runloop
runloop 相关的类
共5个
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
CFRunLoopRef
image.png
CFRunLoopModeRef
image.png
总结如下:
1.CFRunLoopModeRef代表RunLoop的运行模式
2.一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
3.RunLoop启动时只能选择其中一个Mode,作为currentMode
4.如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
5.如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
CFRunLoopModeRef
常见的2种Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响