iOS开发中,我们涉及到的计时器为3种,GCD计时器,CADisplayLink计时器,NSTimer计时器。
GCD计时器
特性:NSTimer有延迟,不是特别准确,所以如果要求特别高的情况下,我们可以用GCD计时器和CADisplayLink计时器;
创建计时器
dispatch_source_t timer
设置计时器
dispatch_source_set_timer
触发事件
dispatch_source_set_event_handler
结束计时器
dispatch_source_set_cancel_handler
开启计时器
dispatch_resume(timer);
CADisplayLink计时器
特性:根据屏幕刷新的频率进行刷新,所以如果屏闪稳定,那么CADisplayLink的计时器就会很准确,除非屏幕达到20HZ以下,就会不准确;
创建计时器
CADisplayLink *displaylink = [CADisplayLink displayLinkWithTarget:self selector:@selector(……)];
添加到当前线程 -> (添加到线程就能正常工作了)
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
停止方法
[displayLink incalidate];
NSTimer定时器
1.不用添加到runloop中
创建计时器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector(……)] userInfo:nil repeats:YES];
释放定时器
[timer invalidate];
暂停
[self.timer setFireDate:[NSDate distantPast]];
继续
[self.timer setFireDate:[NSDate distantFuture]];
2.需要添加到runloop中
创建对象
NSTimer *myTimer = [NSTimertimerWithTimeInterval:3.0 target:selfselector:@selector(timerFired:)userInfo:nilrepeats:NO];
添加到线程中
[[NSRunLoopcurrentRunLoop]addTimer:myTimerforMode:NSDefaultRunLoopMode];
触发(启动)
当定时器创建完(不用scheduled的,添加到runloop中后,该定时器将在初始化时指定的timeInterval秒后自动触发。
可以使用-(void)fire;方法来立即触发该定时器;
停止就用[timer invalidate];NSTimer释放