产品需求有时候会在tableview中加入NSTimer用来倒计时,但是如果使用NSTimer的简便构造方法时:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
在tableview滑动时timer就是显示暂停,原因是timer的这个简便构造方法把timer加入了NSRunLoopDefaultMode上,而tableview在滑动时只会处理UITrackingRunLoopMode,RunLoop并没有处理timer事件。
解决的办法是将timer绑定到NSRunLoopCommonModes上,通过以下方法构造timer:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
通过以下方法将构造的timer绑定到NSRunLoopCommonModes上:
[[NSRunLoop currentRunLoop] addTimer:self.timerforMode:NSRunLoopCommonModes];
这样timer在tableview滑动中就不会暂停了。
当然这样做也不是100%能解决问题,有人反映timer计时不准确。