标签:存在 否则 初始化 integer type property 常见 rac shu
一、介绍
在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码。计时器大概有那么三种,分别是:NSTimer、CADisplayLink、dispatch_source_t
二、使用
@property (strong,nonatomic)NSTimer *timer; @property (strong,nonatomic)CADisplayLink *displaylinkTimer; @property (strong,nonatomic)dispatch_source_t sourceTimer;
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); }
特性:
dispatch_source_set_event_handler(_timer, ^{ //执行事件 dispatch_source_cancel(_timer);} );
重要属性:
dispatch_source_set_timer(dispatch_source_t source,
dispatch_time_t start,
uint64_t interval,
uint64_t leeway);
优点:
注意事项:
三、参考原链接:
http://www.jianshu.com/p/53c07eb57223
iOS:三种常见计时器(NSTimer、CADisplayLink、dispatch_source_t)的使用
标签:存在 否则 初始化 integer type property 常见 rac shu
原文地址:http://www.cnblogs.com/XYQ-208910/p/6590829.html