关于NSTimer的二三事

最近在面试,由于好长时间没有面试,不知道外面的世界,面试尽管做了充足的准备,可是还是会在一些问题上卡壳,在此记录一下吧,平时一知半解,现在正好做个梳理

今天的面试题是  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  例如:


你可能感兴趣的:(关于NSTimer的二三事)