一、监控卡顿的原理
1.1、原理
我们通过监听 NSRunLoop 的状态,就能够发现调用方法是否执行 时间过长,从而判断出是否会出现卡顿。
1.2、监听哪两个状态
- 睡眠前
无法进入睡眠,肯定会影响。
对应状态kCFRunLoopBeforeSources。 - 唤醒后
唤醒后,一直接收消息,无法进入下一步,肯定会影响。
对应状态kCFRunLoopAfterWaiting。
1.3、代码层面
- 创建一个 CFRunLoopObserverContext
观察者。
CFRunLoopObserverContext context = {0,(__bridge void*)self,NULL,NULL};
runLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault,kCFRunLoopAllActivities,YES,0,&runLoopObserverCallBack,&context);
将创建好的观察者 runLoopObserver 添加到
主线程 RunLoop的common 模式下观察。然后,创建一个
持续的子线程专门用来监控主线程的RunLoop 状态。一旦发现进入睡眠前的
kCFRunLoopBeforeSources 状态,或者唤醒后的状态kCFRunLoopAfterWaiting,在设置的时间阈值内一直没有变化,即可判定为卡顿。
1.4、如何获取卡顿的方法堆栈信息
直接调用系统函数
用 signal 进行错误信息的获取。