目录
1. NSTimer
三种常见的定时器:NSTimer、CADisplayLink以及GCD Timer
1. NSTimer
方式一:
// 创建计时器(1s执行一次)
NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantFuture] interval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];
// 添加(默认会被添加到NSDefaultRunLoopMode模式下,滚动时无效)
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
/*
消息处理机制(不断循环检测事件发生)
NSDefaultRunLoopMode 默认模式。在滚动时NSTimer会失效,可添加到NSRunLoopCommonModes中。
NSEventTrackingRunLoopMode 仅在滚动时有效(用于SV和别的控件的动画)
NSRunLoopCommonModes 组合模式:1+2
*/
// 激活计时器
[timer fire];
// 创建并激活计时器
NSTimer *timer2=[NSTimer scheduledTimerWithTimeInterval:1.0 repeats:true block:^(NSTimer * _Nonnull timer) {
}];
// 创建并激活计时器
NSTimer *timer3=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer) userInfo:nil repeats:true];
// 暂停计时器
timer.fireDate=[NSDate distantFuture];
// 继续计时器
timer.fireDate=[NSDate date];
// 销毁计时器
[timer invalidate];
timer=nil;
方式二:NSInvocation
// 1.初始化一个Invocation对象
//
NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(handleTimer:)]];
// 或
NSInvocation *invo=[NSInvocation new];
[invo setTarget:self];
[invo setSelector:@selector(handleTimer:)];
// 2.创建NSTimer
// 创建NSTimer(1s,invo,是否重复)
NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];
// 加入主循环池中
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
// 启动(开始循环)
[timer fire];
// 2.创建NSTimer并启动
NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];
2. CADisplayLink
// :NSObject,不能被继承
// 基于Core Animation
// NStimer是以秒为单位来刷新,CADisplayLink是以帧为单位刷新,可能会跳帧。
CADisplayLink *displayLink=[CADisplayLink displayLinkWithTarget:self selector:@selector(handleChange:)];
// 设置每秒刷新次数(默认值为屏幕最大帧率)
[displayLink setPreferredFramesPerSecond:60];
// 添加到NSRunLoop指定Mode(必须)
//
每当屏幕显示内容刷新结束的时候,runloop就会向 CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
// 上一次屏幕刷新的时间戳
double time=displayLink.timestamp;
// 下一次渲染的时间戳
double timeNext=displayLink.targetTimestamp;
// 每帧之间的时间(即屏幕每次刷新之间的的时间),readOnly
double duration=displayLink.duration;
// 是否暂停
[displayLink setPaused:true];
// 从NSRunLoop指定Mode中移除(要避免多次调用崩溃)
[displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
// 销毁计时器(不会出现崩溃),从NSRunLoop所有Mode中移除
[displayLink invalidate];
displayLink=nil;
网友评论