1,最常见的计时器NSTimer (默认放到defaultModel的runloop中,会受到runloop的影响)
//iOS1010以后的方法它类似,参数一:时间间隔参数二:是否一直执行
[NSTimer timerWithTimeInterval:0.1 repeats:YES block:^(NSTimer *_Nonnull timer) {
NSLog(@"nstimeing");
}];
//唯一结束NSTimer计时器方法
[timer invalidate];
2,CA计时器(不用设置时间间隔,每秒运行60次.默认放到defaultModel的runloop中,会受到runloop的影响)
//创建计时器
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:selfselector:@selector(timerCall:)];
//添加到runloop中
[link addToRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];
//调用方法
- (void)timerCall:(CADisplayLink *)link {
NSLog(@"linking");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//结束计时器的唯一方法
[link invalidate];
});
}
3,GCD计时器,(不受runloop影响,一般用在轮播图等不需要受到runloop影响的情况下)
//GCD计时器在GCD资源里面
dispatch_source_t timer =dispatch_source_create(&_dispatch_source_type_timer, 0, 0,dispatch_get_main_queue());
//调用GCD的set方式
//参数:1,GCD计时器 2,延迟几秒后开始执行 3,计时器间隔 4,计时器精度
dispatch_source_set_timer(timer,DISPATCH_TIME_NOW,0.1*NSEC_PER_SEC, 0ull*NSEC_PER_SEC);
//handle方法(该方法在开启了计时器时调用)
dispatch_source_set_event_handler(timer, ^{
NSLog(@"GCDtimering");
});
//开启计时器
dispatch_resume(timer);
//GCD停止计时器方法,会触发dispatch_source_set_cancel_handler方法
dispatch_source_cancel(timer);
dispatch_source_set_cancel_handler(timer, ^{
//如果在非arc模式下可以在该方法里释放掉timer (dispatch_release(timer);)
NSLog(@"计时器已经停止了");
});
网友评论