当我们启动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];