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,就可以在默認模式和追蹤模式都能夠運行。