一、监控卡顿的原理
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 进行错误信息的获取。
网友评论