1、NSTimer定时器停止问题
界面中加一个textView,点击界面后,然后滚动textView
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"%s",__func__);
__block int count = 0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"---定时器%d",count++);
}];
}
打印结果:
2022-01-21 10:04:27.419118+0800 super-interview[86021:1067429] -[ViewController touchesBegan:withEvent:]
2022-01-21 10:04:28.419527+0800 super-interview[86021:1067429] —定时器0
2022-01-21 10:04:29.419611+0800 super-interview[86021:1067429] —定时器1
2022-01-21 10:04:29.509754+0800 super-interview[86021:1067429] block–kCFRunLoopExit–kCFRunLoopDefaultMode
2022-01-21 10:04:29.509908+0800 super-interview[86021:1067429] block–kCFRunLoopEntry–UITrackingRunLoopMode
2022-01-21 10:04:33.811703+0800 super-interview[86021:1067429] block–kCFRunLoopExit–UITrackingRunLoopMode
2022-01-21 10:04:33.811889+0800 super-interview[86021:1067429] block–kCFRunLoopEntry–kCFRunLoopDefaultMode
2022-01-21 10:04:33.811989+0800 super-interview[86021:1067429] —定时器2
2022-01-21 10:04:34.420417+0800 super-interview[86021:1067429] —定时器3
2022-01-21 10:04:35.419716+0800 super-interview[86021:1067429] —定时器4
会发现,当滚动textView的时候,Runloop的模式切换了,定时器停止工作了
2、改进方式
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"%s",__func__);
__block int count = 0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"---定时器%d",count++);
}];
// 添加到通用模式即可
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}