定时器大家经常使用,今天我们扒一扒 定时器
那些事!!
从题目可以看出,定时器有三个,相对于熟知的是第一个:
NSTimer
NSTimer 介绍
NSTimer
是经常使用的定时器,基本属于随手创建使用的,极大的方便了开发中的一些特殊需求,但是它的坑也不少,先说一下它的基本用法:
创建方法
NSTimer *time = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerSelector:) userInfo:@"123" repeats:YES];
timerWithTimeInterval这两个类方法创建出来的对象如果不用 addTimer: forMode方法 手动加入主循环池中,将不会循环执行。并且如果不手动调用fair,则定时器不会启动。
- TimerIntval:执行之前等待的时间.比如设置成1.0 就代表1秒后执行;
- target:需要执行方法的对象;
- selector:需要执行的方法;
- repeats:是否需要循环;
释放方法
[timer invalidate];
特性
存在延迟:不管是一次性还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoopMode有关.如果RunLoop正在执行一个
连续
的运算,timer就会被延迟触发
。重复性的timer(repeats = yes)遇到这种情况,如果延迟超过一个周期,则会和后面的触发进行合并,即在一个周期内只会触发一次。但是不管该timer的触发时间延迟的有多离谱,后面的timer的触发时间总是倍数于第一次添加timer的间隙。创建方式第二种 : 如果用以下方式创建,必须加入
RunLoop
:
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self seletor:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunloop mainRunloop] addTimer:timer forMode:NSDefaultRunloopMode];
注意 :下面这种创建方式,也就是第一种,并不是不需要添加的RunLoop中,而是自动会添加到 MainRunLoop
中的 NSDefaultRunLoopMode
的模式中!!
NSTimer *time = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerSelector:) userInfo:@"666" repeats:YES];
以上是
NSTimer
的创建方式,基本是两种常用的,还有一个小的注意点,就是RunLoop, 以下我们来说一些不是常用的:
- 需求 : 直播界面中的
直播时长
,基本作用 : 显示了主播的直播时长
,但是,如果APP进入后台
,或者电话来了
,这个时候直播的时长/计时器是需要停止
的--- 当然这里是精确的,如果不精确不停止也无所谓,这个看需求!!
总之,我们进入后台需要停止定时器,进入前台/APP,又需要继续,这个怎么办捏?
- 可以暂停定时器,在某种情况下,再开启:
//关闭定时器
[timer setFireDate:[NSDate distantFuture]];
//开启定时器
[timer setFireDate:[NSDate distantPast]];
- 实际应用 :
//页面将要进入前台,开启定时器
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//开启定时器
[scrollView.timer setFireDate:[NSDate distantPast]];
}
//页面消失,进入后台不显示该页面,关闭定时器
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
//关闭定时器
[scrollView.timer setFireDate:[NSDate distantFuture]];
}
这样做的好处: 可以节省资源消耗,避免定时器在后台一直运行,占用CPU!!