推广

使用RunLoop检测卡顿

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

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://0291.com.cn/post/56822.html

相关文章

小红书上,还有中小创业者的机会吗?

小红书上,还有中小创业者的机会吗?

编辑导语:有些时候,大公司的新媒体账号,反而没有中小公司的账号做得好,这是为什么呢?小红书上中小创业者的机会又在哪里呢?本文作者分享了关于新媒体流量的几个发现和思考,一起来看一下吧。 最近,我们参与运营的几个小红书新账号,效果特别好,有3个景区账号在注册后的3天粉丝破千,1家民...

拼多多怎么认定新用户?揭秘拼多多新用户识别攻略

拼多多怎么认定新用户?揭秘拼多多新用户识别攻略

拼多多作为我国电商界的一匹黑马,吸引了大量新用户涌入。那么,拼多多是如何认定新用户的呢?本文将为你揭秘拼多多新用户识别攻略,让你轻松掌握拼多多新用户的认定方法。 一、拼多多新用户的认定标准 拼多多对于新用户的认定,主要基于以下几个方面1. 未在拼多多平台注册过账号:一个用户如果从未...

2020年的影响力营销策略,参考这一条

2020年的影响力营销策略,参考这一条

研究分享【2020年的影响力策略,参考这一条】49%的用户信赖影响者的推荐和建议,并且影响营销活动的平均回报率为6:1。许多B2B营销人员面临的共同问题是:什么是B2B背景下的影响力营销?其核心应该是与行业内的领军人物合作,打造优质,增强信誉、参与度,增加销量,并带来新的用...

SEO优化有怎样的经验之谈。

SEO优化有怎样的经验之谈。

1.SEO优化一定要注重进步网站页面内容的质量,吸收用户眼球 毫无疑问,这点无须置疑十分重要,主要是提炼每个页面标题的精简度和网页页面内容相关联,保证他们之间有相关联络。比方:我们打算要写的文章是关于“SEO优化”的。那我们文章的标题以及文章内容都应该紧紧盘绕SEO优化来停止展开。无论文字还是图片...

教你做好网络推广需要注意的2点要素。

教你做好网络推广需要注意的2点要素。

网站怎么推广?网站怎么宣传?关键词怎么上排名?网站怎么才能来流量?这些问题已经成为网络推广的惯性问题了。你要知道网站推广的路不是一朝一夕就能走好,是要通过不断的改进才能提高,要不停的磨练才能得到升华。 说起做网站推广,通常来讲就是做站内的优化与外链了。做站内简而言之就是做好页面内容、页面布局、页面...

川报集团与绵阳科技城新区联合“新区观察”揭牌讲好新区故事

封面新闻记者 王祥龙3月30日下午,绵阳科技城新区联合四川日报报业集团联合打造的新区观察工作室正式揭牌。该工作室定位于学习室、室、服务室、联络室和形象室,将以“准媒体”的方式进行运作,对绵阳科技城新区的建设和发展进行全方位关注。同时,工作室将践行媒体深度融合原则,通过整合资...

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

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