1.CADisplayLink
保证调用频率和屏幕的刷帧频率一致,1秒调用60次;
2.timer
NSTimer依赖Runloop,如果runloop的任务过于繁重的话,就不准时了。
runloop每跑一圈话费的时间是不固定;
GCD的定时器是不依赖runloop的比较准时;
// 会发生循环引用;
self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(linkTest)];
[self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[LZHProxy proxyWith:self] selector:@selector(linkTest) userInfo:nil repeats:YES];
// 解决循环引用方法一:
__weaktypeof(self) weakSelf =self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelflinkTest];
}];
//消息转发机制;
// NSProxy
// GCD的定时器
NSLog(@"begin");
// 创建定时器 :如果队列是非主队列,会自动放入子线程执行任务定时器‘
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_main_queue());
// 设置定时器的时间;
uint64_tstart =2.0;//2秒后开始执行
uint64_tinterval =1.0;//每隔1秒执行
dispatch_source_set_timer(timer,dispatch_time(DISPATCH_TIME_NOW, start*NSEC_PER_SEC), interval * NSEC_PER_SEC, 0);
// 设置回调函数
dispatch_source_set_event_handler(timer, ^{
NSLog(@"-----");
});
dispatch_source_set_event_handler_f(timer,timerFire);
// 启动定时器
dispatch_resume(timer);