1. CADisplayLink定时器
- CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。
- CADisplayLink有两种模式注册到runloop
-
NSDefaultRunLoopMode
当进行其他UI刷新操作会停止定时器
-
NSRunLoopCommonModes
当进行其他UI刷新操作不会停止定时器
- 所以通常情况下,按照iOS设备屏幕的刷新率60次/秒
- 应用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(nextImage)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSRunLoopCommonModes]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
// 关闭定时器两种方法
self.displayLink.paused = NO;
[self.displayLink invalidate];
2.延迟调用
[self performSelector:@(方法名) withObject:nil afterDelay:1.0];
3.NSTimer
- (void)addTimer{
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
// 当进行其他UI刷新操作不会停止定时器
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
// 当进行其他UI刷新操作会停止定时器
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}
4.GCD定时器
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 1秒后执行block里面的代码
}
5.GCD中的非常精确的定时器
//0.创建一个队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//1.创建一个GCD的定时器
/*
第一个参数:说明这是一个定时器
第四个参数:GCD的回调任务添加到那个队列中执行,如果是主队列则在主线程执行
*/
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//2.设置定时器的开始时间,间隔时间以及精准度
//设置开始时间,三秒钟之后调用
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW,3.0 *NSEC_PER_SEC);
//设置定时器工作的间隔时间
uint64_t intevel = 1.0 * NSEC_PER_SEC;
/*
第一个参数:要给哪个定时器设置
第二个参数:定时器的开始时间DISPATCH_TIME_NOW表示从当前开始
第三个参数:定时器调用方法的间隔时间
第四个参数:定时器的精准度,如果传0则表示采用最精准的方式计算,如果传大于0的数值,则表示该定时切换i可以接收该值范围内的误差,通常传0
该参数的意义:可以适当的提高程序的性能
注意点:GCD定时器中的时间以纳秒为单位(面试)
*/
dispatch_source_set_timer(timer, start, intevel, 0 * NSEC_PER_SEC);
//3.设置定时器开启后回调的方法
/*
第一个参数:要给哪个定时器设置
第二个参数:回调block
*/
dispatch_source_set_event_handler(timer, ^{
NSLog(@"------%@",[NSThread currentThread]);
});
//4.执行定时器
dispatch_resume(timer);
//注意:dispatch_source_t本质上是OC类,在这里是个局部变量,需要强引用
self.timer = timer;
网友评论