2019独角兽企业重金招聘Python工程师标准>>>

实现原理:开启子线程监控主线程的RunLoop的状态,并设定超时时间。如果发生了超时,而且此时RunLoop的状态为kCFRunLoopBeforeSources 或  kCFRunLoopAfterWaiting,认为主线程卡顿;

CFRunLoopObserverRef _runloopObserver;dispatch_semaphore_t _semaphore;NSInteger _timeOutCount;CFRunLoopActivity _activity;void runLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{ViewController *vc = (__bridge ViewController *)info;vc->_activity = activity;switch (activity) {case kCFRunLoopAfterWaiting:NSLog(@"kCFRunLoopAfterWaiting");break;case kCFRunLoopBeforeSources:NSLog(@"kCFRunLoopBeforeSources");break;case kCFRunLoopBeforeWaiting:NSLog(@"kCFRunLoopBeforeWaiting");break;case kCFRunLoopBeforeTimers:NSLog(@"kCFRunLoopBeforeTimers");break;default:break;}dispatch_semaphore_t semaphore = vc->_semaphore;dispatch_semaphore_signal(semaphore);
}//开始监控
-(void)startMonitor
{if(_runloopObserver){return;}_semaphore = dispatch_semaphore_create(0);CFRunLoopObserverContext context = {0, (__bridge void *)(self), NULL, NULL};_runloopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, runLoopObserverCallBack, &context);CFRunLoopAddObserver(CFRunLoopGetMain(), _runloopObserver, kCFRunLoopCommonModes);//开启子线程循环监控dispatch_async(dispatch_get_global_queue(0, 0), ^{while (YES) {dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);long semaphoreWait = dispatch_semaphore_wait(_semaphore, time);if(semaphoreWait != 0){ //超时if(!_runloopObserver){_timeOutCount = 0;_semaphore  = 0;_activity = 0;return;}if(_activity == kCFRunLoopAfterWaiting || _activity == kCFRunLoopBeforeSources){NSLog(@"发现一次延时");if(++_timeOutCount < 3){continue;}}}else{_timeOutCount = 0;}}});
}

完整的demo路径:https://github.com/xiaobai1315/MonitorMainQueue

转载于:https://my.oschina.net/mexiaobai1315/blog/1574548

通过RunLoop监听主线程的卡顿相关推荐

  1. iOS主线程卡顿监测

    iOS开发过程中,我们有时需要监控主线程的卡顿情况,本文介绍主线程卡顿的实现方法. 新建MainThreadMonitor类,并且在.h中声明方法. #import <Foundation/Fo ...

  2. runloop解决Cell上主线程卡顿

    1解决cell上的主线程加载卡顿问题 通过添加runloop 观察者,卡顿等待的时候进行处理 视频地址 v.youku.com/v_show/id_X- RunLoopMode 5 种mode 使用 ...

  3. Android 中的卡顿丢帧原因概述 - 应用篇

    在Android 中的卡顿丢帧原因概述 - 系统篇[1] 这篇文章中我们列举了系统自身原因导致的手机卡顿问题 , 这一篇文章我们主要列举一些由于 App 自身原因导致的卡顿问题. 各位用户在使用 Ap ...

  4. Tomcat主线程监听SHUTDOWN,如何远程关闭Tomcat?守护线程守护了谁?

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助.本篇文章有些简单,周末水了水了... 文章目录 一.前言 守护线程守护了谁 二.Tomcat主线程 ...

  5. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  6. Go 学习笔记(25)— 并发(04)[有缓冲/无缓冲通道、WaitGroup 协程同步、select 多路监听通道、close 关闭通道、channel 传参或作为结构体成员]

    1. 无缓冲的通道 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道. 这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能 ...

  7. Android 超清大尺寸图片压缩转Base64中卡顿/速度优化问题整理(在子线程压缩Bitmap卡的主线程进度条走不动了。。。)

    最近遇到需求是前后端传输图片使用的是Base64,但是前端(Android 端)图片很大(尺寸很大4480 × 2520,质量也很大7-10M),需要压缩到一定尺寸(1280 × 960,当然还可以压 ...

  8. iOS 页面的卡顿的原因以及如何解决. 如何优化app的启动速度

    1.死锁: 主线程拿到锁A, 需要获取锁B, 而同时子线程拿了锁B, 需要锁A, 这时主线程等待锁B的释放, 子线程等待锁A的释放, 相互等待. 2.抢锁: 主线程需要访问DB, 而这时某个子线程往D ...

  9. 微信Android客户端的卡顿监控方案

    2021.8.1  Matrix 2.0 TraceCanary新增了以下功能 微信Android客户端的卡顿监控方案 https://mp.weixin.qq.com/s/3dubi2GVW_rVF ...

最新文章

  1. 10行Python,搭建一个游戏AI | 视频教程
  2. SVN:This client is too old to work with working copy…解决的方法
  3. 热烈庆贺清明小长假的到来
  4. hdu 2988 Strange fuction【模拟退火】
  5. 新课标下计算机教学,浅析新课程标准下小学信息技术教学
  6. android运行内存与存储内存,运行内存和机身内存的区别 这些知识你知道吗
  7. 面试基础算法及编程 第三弹(树(二叉树)相关:主要考察指针相关的操作)
  8. repo init和sync命令的实用小技巧
  9. java day43【Filter:过滤器 、Listener:监听器】
  10. failed to load resource the server responded with a status of 500 (internal server error)
  11. hdu3336 Count the string
  12. VC6生成Release版本程序
  13. 一个完整的SPC案例—从特性分析到CPK计算
  14. 从EXCEL导入CAD后如何设置表格文字大小?
  15. Linux系统通过console口连接交换机
  16. Value of type java.lang.String cannot be conver...
  17. 使用神器you-get获取萧大bilibili课程视频
  18. (转)看穿机器学习(W-GAN模型)的黑箱
  19. Maven学习笔记(三)——为什么mvn test运行测试不显示测试统计信息和测试结果
  20. Java面试题仅供自己学习

热门文章

  1. 初始Java DVD项目
  2. (剑指Offer)面试题61:按之字形顺序打印二叉树
  3. poco vs Boost
  4. D5RPG引擎的一些笔记
  5. excel html modify,在Excel 2010中修改Series对象上的Z-index(Modify Z-index on Series object in Excel 2010)...
  6. python格式化文本_Python格式化大文本
  7. android时间utc,Android获取UTC时间的方式
  8. Python可迭代的对象与迭代器
  9. exa:一个 ls 命令的现代替代品
  10. 如何将 CentOS迁移到 AlmaLinux?