最近在面试,由于好长时间没有面试,不知道外面的世界,面试尽管做了充足的准备,可是还是会在一些问题上卡壳,在此记录一下吧,平时一知半解,现在正好做个梳理
今天的面试题是 NSTimer准么?为什么不准?
这有点经验的大家都知道不准,但是为什么不准呢,具体我们来说说
1.NStimer必须添加到runloop中才会被调用,而每个runloop都对应一个mode,如果timer不在在所指定的runloop中,那么timer就不会被触发
所以综上所述,timer不被触发的原因有三个:
a.没有添加到runloop中
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];//此种创建timer的方法必须需要手动添加到runloop中
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"timer执行了");
}];//此种方法自动就将timer加到了主线程的runloop的NSDefaultRunLoopMode模式中
b.runloop当前的mode与timer指定的mode不一样
c.runloop是否运行,主线的runloop默认会被启动,模式为NSDefaultRunLoopMode 当滑动时切换至trackingMode 而我们自己起的线程,如果不获取是不会有runloop的,所以当在非主线程中添加timer 一定要执行以下语句将runloop运行起来
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
2.在timer指定的runloop中,如果正在执行一项耗时的连续运算,比如这项运算需要8s钟,而timer是每隔5s钟执行一次,那么此时的timer就会延时执行,比如正常应该在5s中执行,但是这个时候需要在这项耗时的运算结束后按照5s间隔开始执行,比如8s执行完以后呢,13s开始执行timer方法。
解决timer不准时方法:
1.另起一个线程,在此线程中开一个timer 例如:
![](https://img.haomeiwen.com/i920709/bd12b0cc4fc11851.jpg)
![](https://img.haomeiwen.com/i920709/e6a9ba7ba62da04b.jpg)
![](https://img.haomeiwen.com/i920709/1769c7db6cbc9112.png)
网友评论