2018-05-iOS:三种常见计时器(NSTimer、CADi

2019-06-29  本文已影响0人  _coCo__

一、介绍

在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码。计时器大概有那么三种,分别是:NSTimer、CADisplayLink、dispatch_source_t

二、使用

@property (strong,nonatomic)NSTimer *timer;
@property (strong,nonatomic)CADisplayLink *displaylinkTimer;
@property (strong,nonatomic)dispatch_source_t sourceTimer;</pre>

1、NSTimer:

//NSTimer
-(void)createTimer{ //初始化 //_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) { //执行操作 //}];
 _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerStart:) userInfo:nil repeats:YES]; //加入runloop循环池
 [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode]; //开启定时器
 [_timer fire];
}

-(void)timerStart:(NSTimer *)timer{
    NSLog(@"%s-----%lf",__func__,timer.timeInterval); //销毁定时器 //[_timer invalidate]; //_timer = nil;
}

解释:

注意 :
调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

特性:

使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:

NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

2、CADisplayLink:

//CADisplayLink
-(void)createCADisplayLink{

    _displaylinkTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
    [_displaylinkTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

-(void)handleDisplayLink:(CADisplayLink *)displaylinkTimer{
    NSLog(@"%s-----%ld",__func__,displaylinkTimer.preferredFramesPerSecond); //销毁定时器 //[_displaylinkTimer invalidate]; //_displaylinkTimer = nil;
}

解释:

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。

特性:

使用场景:

重要属性:

3、dispatch_source_t:

//dispatch_source_t
-(void)createDispatch_source_t{ //创建全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //使用全局队列创建计时器
    _sourceTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); //定时器延迟时间
    NSTimeInterval delayTime = 1.0f; //定时器间隔时间
    NSTimeInterval timeInterval = 1.0f; //设置开始时间
    dispatch_time_t startDelayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC)); //设置计时器
    dispatch_source_set_timer(_sourceTimer,startDelayTime,timeInterval*NSEC_PER_SEC,0.1*NSEC_PER_SEC); //执行事件
    dispatch_source_set_event_handler(_sourceTimer,^{ //销毁定时器 //dispatch_source_cancel(_myTimer);
 }); //启动计时器
 dispatch_resume(_sourceTimer);
}

特性:

<pre style="font-family: Arial, Helvetica, sans-serif; padding: 5px; max-width: 680px !important; background-color: rgb(246, 246, 246); border: 1px dotted rgb(170, 170, 170); white-space: pre-wrap; word-wrap: break-word;">dispatch_source_set_event_handler(_timer, ^{ //执行事件
 dispatch_source_cancel(_timer);}
);</pre>

重要属性:

<pre style="font-family: Arial, Helvetica, sans-serif; padding: 5px; max-width: 680px !important; background-color: rgb(246, 246, 246); border: 1px dotted rgb(170, 170, 170); white-space: pre-wrap; word-wrap: break-word;">dispatch_source_set_timer(dispatch_source_t source, 
                          dispatch_time_t start,
                          uint64_t interval, 
                          uint64_t leeway);</pre>

优点:

注意事项:

三、参考原链接:

http://www.jianshu.com/p/53c07eb57223

上一篇下一篇

猜你喜欢

热点阅读