Runloop监控卡顿

一、监控卡顿的原理

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 添加到主线程 RunLoopcommon 模式下观察。

  • 然后,创建一个持续的子线程专门用来监控主线程的 RunLoop 状态

  • 一旦发现进入睡眠前的kCFRunLoopBeforeSources 状态,或者唤醒后的状态kCFRunLoopAfterWaiting,在设置的时间阈值内一直没有变化,即可判定为卡顿

1.4、如何获取卡顿的方法堆栈信息

  • 直接调用系统函数
    用 signal 进行错误信息的获取。

  • PLCrashReporter

你可能感兴趣的:(Runloop监控卡顿)