NSTimer定时器有时候不准确的原因

当我们启动NSTimer定时器时,其并不是按照时间的间隔进行循环调用的。事实上,在定时器注册到Runloop中后,runloop会设置一个一个的时间点进行调用,比如10,20,30.如果错过了某个时间点,则定时器并不会延时调用,而是等待下一个时间点调用,所以定时器并不是准确的。
定时器的实现是基于Runloop的,平时我们使用定时器或许并没有对Runloop做什么操作,那是因为主线程的runloop默认开启运行的,如果我们在子线程中也需要重复执行某一动作,需要手动开启定时器。例如

- (void)viewDidload {
  [super viewDidload];
  queue = dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async (queue, ^{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(time) userInfo:nil repeat:YES];
});
}

- (void)time {
 NSLog(@"run");
}

运行后,发现,定时器并没有启动,我们必须在线程中手动执行下面的代码,定时器才能正常工作

[[NSRunLoop currentRunLoop] run];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。