基于runloop检测卡顿
2021-09-13 本文已影响0人
helinyu
原理:
检测卡顿主要是找到主线程上做了哪些事情。
线程的消息事件是依赖于NSRunloop的, 所以,从NSRunloop入手,就可以知道主线程上都调用了哪些方法,我们通过监听NSRunloop的状态,就能发现调用方法是否执行时间过长, 从而判断出来是否出现卡顿。
转换: 通过监控runloop的状态来判断是否出现卡顿。
RunLoop是用来监听输入源,进行调度处理的。这里的输入源可以是输入设备、网络、周期性或者延迟时间、异步回调。RunLoop会接受两种类型的输入源:一种是来自另一个线程或者来自不同应用的异步消息;另一种是来自预定时间或者重复间隔的同步事件。 ———— 感觉这个不太准确
RunLoop的目的是,当有事件要去处理时保持线程忙,当没有事件要处理时让线程进入休眠。所以,了解RunLoop原理不光能够运用到监控卡顿上,还可以提高用户的交互体验。通过将那些繁重而不紧急会大量占用CPU的任务(比如图片加载),放到空闲的RunLoop模式里执行,就可以避开在UITrackingRunLoopMode这个RunLoop模式时执行。UIUITrackingRunLoopMode是用户进行滚动操作时会切换的RunLoop模式。避免在这个RunLoop模式执行繁重的CPU任务,就能避免影响用户交互操作上的体验。
将创建好的观察者runLoopObserver添加到主线程RunLoop的common模式下观察,然后,创建一个持续的子线程专门用来监控主线程的RunLoop状态。