NSTimer 定时器相关问题汇总

1:NSTimer的创建

- (void)viewDidLoad {
    [super viewDidLoad];

    NSTimer *timer1 =[NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(action:) userInfo:nil repeats:YES];
    [timer1 fire];

}
-(void)action:(NSTimer *)timer{
    NSLog(@"定时器开");
}

这时会发现timer的ation方法不会调用。
坑一:子线程启动定时器问题:
我们都知道iOS是通过runloop作为消息循环机制,主线程默认启动了runloop,可是子线程没有默认的runloop,因此,我们在子线程启动定时器是不生效的。

2.NSTimer计时停止失效(比如滑动屏幕的时候)


   NSTimer *timer1 =[NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(action:) userInfo:nil repeats:YES];
   [[NSRunLoop currentRunLoop] addTimer:timer1 forMode:NSDefaultRunLoopMode];
}

-(void)action:(NSTimer *)timer{
    NSLog(@"定时器开");
}

坑二:runloop的mode问题:

我们注意到schedule方式启动的timer是add到runloop的NSDefaultRunLoopMode中,这就会出现其他mode时timer得不到调度的问题。最常见的问题就是在UITrackingRunLoopMode,即UIScrollView滑动过程中定时器失效。

解决方式就是把timer add到runloop的NSRunLoopCommonModes。UITrackingRunLoopMode和kCFRunLoopDefaultMode都被标记为了common模式,所以只需要将timer的模式设置为NSRunLoopCommonModes,就可以在默认模式和追踪模式都能够运行。

你可能感兴趣的:(NSTimer 定时器相关问题汇总)