面试被问到,一直没有注意过,在此补上。
问题描述
控制器中存在定时器以及tableview,当滑动tableview时,定时器停止计时,tableview再次停止后,计时恢复。
代码测试
使用label显示计时情况
方案一:将定时器添加到其他线程,并开启runloop
dispatch_async(dispatch_get_global_queue(0, 0), ^{
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timeNumChange) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] run];
});
- (void)timeNumChange {
self.count++;
dispatch_async(dispatch_get_main_queue(), ^{
self.timeNum.text = [NSString stringWithFormat:@"runloop:%ld",self.count];
});
}
方案二:将timer添加到指定mode(UITrackingRunLoopMode、NSRunLoopCommonModes)
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timeNumChange) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:UITrackingRunLoopMode];
- (void)timeNumChange {
self.count++;
self.timeNum.text = [NSString stringWithFormat:@"runloop:%ld",self.count];
}
最后转载一篇更详细的文章:深入理解RunLoop