iOS中的定时器 - NSTimer、CADisplayLink、dispatch_source ---- 其一(NSTimer - 逐步完善中……)

定时器大家经常使用,今天我们扒一扒 定时器 那些事!!

从题目可以看出,定时器有三个,相对于熟知的是第一个: 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!!

你可能感兴趣的:(iOS中的定时器 - NSTimer、CADisplayLink、dispatch_source ---- 其一(NSTimer - 逐步完善中……))