推广

使用RunLoop检测卡顿

iseeyu2年前 (2024-02-21)推广147

image

CFRunLoop完整代码:opensource.apple.com/source/CF/C…

RunLoop的六个状态
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry , // 进入 loop
    kCFRunLoopBeforeTimers , // 触发 Timer 回调
    kCFRunLoopBeforeSources , // 触发 Source0 回调
    kCFRunLoopBeforeWaiting , // 等待 mach_port 消息
    kCFRunLoopAfterWaiting ), // 接收 mach_port 消息
    kCFRunLoopExit , // 退出 loop
    kCFRunLoopAllActivities  // loop 所有状态改变
}

如果RunLoop的线程,进入睡眠前方法的执行时间过长而导致无法进入睡眠,或者线程唤醒后接受消息时间过长而无法进入下一步的话,就可以认为是线程受阻了。如果这个线程是主线程的话,表现就是出现卡顿。

所以,如果我们要利用RunLoop原理来监控卡顿的话,就要关注这两个阶段。RunLoop在进入睡眠之前和唤醒后的两个loop状态定义的值,分别是kCFRunLoopBeforeSource和kCFRunLoopAfterWaiting,也就是要触发Source0回调和接受mac_port消息两个状态。

如何检查卡顿?

首先需要创建一个CFRunLoopObserverContext观察者,代码如下:

CFRunLoopObserverContext context = {0,(__bridge void*)self,NULL,NULL};
runLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault,kCFRunLoopAllActivities,YES,0,&runLoopObserverCallBack,&context);

将创建好的观察者runLoopObserver添加到主线程RunLoop的common模式下观察,然后,创建一个持续的子线程专门用来监控主线程的RunLoop状态。

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

开启子线程监控的代码如下:

//创建子线程监控
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    //子线程开启一个持续的 loop 用来进行监控
    while (YES) {
        //semaphoreWait 信号等待的时间
        long semaphoreWait = dispatch_semaphore_wait(dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC));
        if (semaphoreWait != 0) {
            if (!runLoopObserver) {
                timeoutCount = 0;
                dispatchSemaphore = 0;
                runLoopActivity = 0;
                return;
            }
            //BeforeSources 和 AfterWaiting 这两个状态能够检测到是否卡顿
            if (runLoopActivity == kCFRunLoopBeforeSources || runLoopActivity == kCFRunLoopAfterWaiting) {
                //将堆栈信息上报服务器的代码放到这里
            } //end activity
        }// end semaphore wait
        timeoutCount = 0;
    }// end while
});

获取堆栈信息使用PLCrashReporter.

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56822.html

相关文章

如何平衡百度熊掌号和百家号与独立网站三者间。

如何平衡百度熊掌号和百家号与独立网站三者间。

不管是百家号也好,仍是熊掌号也好这两个产品的录入速度都十分快,远远比官网的录入要快当然了,这也正常毕竟是百度十分重要的两款产品录入快关于营销来说,也是功德由于关于事务仍是十分需求网站端的企业或组织来说就存在:网站,百家号,熊掌号面向查找的有三个渠道在发布信息。 这个问题的潜在意思是:...

抖音“嫌弃”数字人直播

抖音“嫌弃”数字人直播

数字人技术刚开始的时候,因为成本高昂被大家所嫌弃。但经过数年发展,成本降低,而且其24小时在线的特性,让其成为直播的另一种选择。今年,国内上演“百模大战”,低沉本的数字人进入市场,百元级别的数字分身迅速被炒成一本万利的财富经。 午夜1点的直播间,一位女主播还在引导用户购买团购券...

让你事半功倍的工作效率优化技巧大揭秘

让你事半功倍的工作效率优化技巧大揭秘

对于很多从事计算机行业的人来说,经常要接触到SEO优化工作,但是SEO优化也是有的,找对了seo优化技巧可以让你工作起来事半功倍哦。下面我们一起来了解一下seo优化技巧的相关资料吧。 seo优化技巧一结构框架优化 一个好的网站还要看它网站结构布局,现在普遍使用的网站结构都是DIV+CSS设计模式...

巴菲特:财富背后的核心逻辑与智商和学历无关,而是要有4样东西

财富是每个人都想要得到的东西,因为财富所带来的力量是无穷的。然而,对于有钱人来说,并不是一件特别困难的事情,但对于穷人来说,赚钱的道路却显得格外艰难。股神巴菲特无疑是富人界的翘楚,那么他为什么会取得如此成功,拥有如此多的财富呢?其实财富背后的核心逻辑与智商和学历无关,而是要...

如何提高房产销售获客渠道?

如何提高房产销售获客渠道?

如何提高房产销售获客?...

分享SEO员工面试的流程是什么。

分享SEO员工面试的流程是什么。

随着百度算法的不断改变,对于一些最常见的seo方法已经不再试用,百度拥有上千位算法分析师,大量的SEO专家云集,确保其整个算法架构的正常运行。 而对于企业而言,我们在选择SEO的时候,同样会更倾向的选择,那些符合搜索时代新步伐的小伙伴,因此,我们在SEO员工面试的时候,就应该多加思考。...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片