一、NSTimer的使用
- (void)createNSTimer
{
// 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法
// 必须进行停止 —— 释放 [_timer invalidate];
// 自动把timer加入MainRunloop的NSDefaultRunLoopMode中
#if 0
_GZDTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(Logs) userInfo:nil repeats:YES];
#endif
// 这种方法需要手动添加到NSDefaultRunLoopMode runloop的运行循环中,否则无法运行
_GZDTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(Logs01) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_GZDTimer forMode:NSDefaultRunLoopMode];
}
- (void)Logs
{
NSLog(@"NSTimer 自动运行循环 >>>>>>>");
}
- (void)Logs01
{
NSLog(@"NSTimer 手动运行循环 >>>>>>>");
}
二、CADisplayLink的使用
// 使用CADisplayLink需要记得停止定时器,停止的方法
// 停止displayLink的定时器
//[self.displayLink invalidate];
//self.displayLink = nil;
- (void)createCADisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(GZDDisplayLink)];
// NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
// readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。
/**当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。**/
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)GZDDisplayLink
{
NSLog(@"GZDDisplayLink >>>>>>> ");
}
三、GCD
- (void)createGCD
{
/**
* 只执行一次
*/
#if 0
double delayInSeconds = 2.0;//两秒后,执行一次
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//执行事件
NSLog(@"只执行一次>>>>>>>");
});
#endif
NSTimeInterval timerInterval = 1.0; //设置时间间隔
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// _timer必须为全局变量
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), timerInterval * NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
//在这里执行事件
NSLog(@"GCD ----- 1s执行一次 >>>>>>>");
});
dispatch_resume(_timer);
}
详细的源码可以去我的github下载参考
https://github.com/daniel1214/160829-TimeUser