iOS NSTimer不走的问题
时间:2022-07-23
本文章向大家介绍iOS NSTimer不走的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
iOS NSTimer不走的问题
背景
这个版本上线后,突然发现埋点数据直线下降,调试后发现是定时器上传的方法没有走,但是定时器的方法本期并没有修改过。代码如下
- (BOOL)initTimer() {
self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selector(handleUpload) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.uploadTimer forMode:NSRunLoopCommonModes];
}
排查
这个handleUpload方法,怎么都不会走,但是在之前的版本中就是好的,排查了之后发现,是外层调用的地方加了一层异步。即调用的地方变成了
dispatch_async(dispatch_get_global_queue(0, 0), ^{
initTimer()
});
然后就导致了定时器没有启动。
原因
iOS是通过runloop作为消息循环机制,主线程默认启动了runloop,可是自线程没有默认的runloop,因此,我们在子线程启动定时器是不生效的。
解决方法:在子线程启动一下runloop即可
- (BOOL)initTimer() {
self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selector(handleUpload) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.uploadTimer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
}
思考
通过这个问题,有两点收获,
- timer在iOS开发中经常使用,在很多博客中都看到关于timer要注意的地方也很多,通常是内存管理,timer启动相关,但是在开发中,如果没有真正遇到问题,没有“疼”在自己身上,就自己注意的就不够,经过这次之后,相信以后再要在异步使用timer,肯定会留心很多。
- 这个地方initTimer其实是一个SDK初始化的类,其实SDK内部没有修改,但是外层使用SDK的App调用修改了,就导致了SDK不能正常工作。所以封装SDK时要注意,如果使用timer,要么做线程检查,要么就直接把代码安全保证好;因为不能保证第三方调用者使用时的情况,所以要保证自己代码的正确性。
参考
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 使用R语言获得16S物种丰度
- 二叉树的基础---四种遍历方式的 Java 实现
- MySQL 架构与历史
- 通过案例学Python之assert
- Spring Boot入门系列(十六)整合pagehelper,一秒实现分页功能!
- Python文件的读写
- Python正则表达式(下)
- spring boot 如何统一处理 Filter、Servlet 中的异常信息
- 10分钟理解Focal loss数学原理与Pytorch代码(翻译)
- 十分钟了解受控文本生成 1
- 数据库系统设计概述
- Java基础篇(03):流程控制语句,和算法应用
- 09 | Tornado源码分析:Future 对象
- 面向对象的7种设计原则(4)-合成/聚合复用原则
- Netty之异步通知机制