定时不准原因
- NSDefaultRunLoopMode 模式中 优先处理输入源事件,处理输入源事件时,不能处理定时源事件
- 当主线程阻塞时,定时器也会阻塞
- 如果UITableView滑动时,runloop的mode切换为UITrackingRunLoopMode,计时中断
//这里的本质是 NSDefaultRunLoopMode 不能使用这种事件循环的模式
// [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//1.手动开启定时器
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
//2.手动加入到事件循环中
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//3.手动开启定时器
[timer fire];
//NSRunLoop 事件循环 处理的事件有:1.输入源事件(滑动事件、触摸事件)2.定时源事件
//NSDefaultRunLoopMode 模式中 优先处理输入源事件,处理输入源事件时,不能处理定时源事件
[[NSRunLoop currentRunLoop] run];
});