RunLoop的基本作用
保持程序的持续运行,处理App中的各种事件(比如触摸事件、定时器事件等),节省CPU资源,提高程序性能:该做事时做事,该休息时休息。
1.讲讲 RunLoop,项目中有用到吗?
有,线程保活和防止在界面进行滚动的状态下,NSTimer失效的问题。
runloop内部实现逻辑?
01、通知Observers:进入Loop
02、通知Observers:即将处理Timers
03、通知Observers:即将处理Sources
04、处理Blocks
05、处理Source0(可能会再次处理Blocks)
06、如果存在Source1,就跳转到第8步
07、通知Observers:开始休眠(等待消息唤醒)
08、通知Observers:结束休眠(被某个消息唤醒)
01> 处理Timer
02> 处理GCD Async To Main Queue
03> 处理Source1
09、处理Blocks
10、根据前面的执行结果,决定如何操作
01> 回到第02步
02> 退出Loop
11、通知Observers:退出Loop
runloop和线程的关系?
一对一的关系,每条线程都有唯一的一个与之对应的RunLoop对象,RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value,线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建,主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop,RunLoop会在线程结束时销毁。
timer 与 runloop 的关系?
程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?
将runloop的运行模式修改成 NSRunloopCommonMode模式即可。
runloop 是怎么响应用户操作的, 具体流程是什么样的?
说说runLoop的几种状态
runloop的mode作用是什么?
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响