美文网首页iOS bug修复
Runloop监控卡顿

Runloop监控卡顿

作者: huoshe2019 | 来源:发表于2019-10-21 11:48 被阅读0次

    一、监控卡顿的原理

    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监控卡顿

        本文链接:https://www.haomeiwen.com/subject/jdazmctx.html