NSTimer
相信使用过 NSTimer 的同学或多或少碰到过这么一个BUG:滚动视图(UITableView或UIScrollView等)上的定时器,滑动过程中会出现NSTimer不工作的现象。
BUG版本效果:
大家可以观察一下,滑动过程中,NSTimer 停止工作(不滑动是正常倒计时的,再次不做展示)
代码如下:
1 // 创建定时器 2 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.f 3 target:self 4 selector:@selector(updateTime:) 5 userInfo:endSecs 6 repeats:YES];
参数:
1 /** 2 * @brief 创建定时器 3 * 4 * @param ti 倒计时时间间隔 5 * @param aTarget 响应者 6 * @param aSelector 方法选择器 7 * @param userInfo 参数 8 * @param yesOrNo 是否重复 9 * 10 * @return 返回对象 11 */ 12 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
改正版本效果:
这一版本,修正了 NSTimer 不工作的bug。
代码如下:
1 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.f 2 target:self 3 selector:@selector(updateTime:) 4 userInfo:endSecs 5 repeats:YES]; 6 // NSRunLoopCommonModes:是一个模式集合,当绑定一个事件源到这个模式集合的时候就相当于绑定到了集合内的每一个模式。 7 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
或者:
1 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:UITrackingRunLoopMode];
最后建议大家在销毁视图控制器时,关闭计时器。
未关闭定时器,查看打印结果:
1 2016-03-20 11:10:49.799 HZProject[8454:1089566] timer ---------- 2 2016-03-20 11:10:50.425 HZProject[8454:1089566] -[HZMineGrouponDetailController dealloc] 3 2016-03-20 11:10:50.798 HZProject[8454:1089566] timer ----------
虽然,视图控制器销毁了,但是计时器仍然在工作状态下!!
建议:
1 // 关闭定时器 2 [self.timer invalidate];
1 2016-03-20 11:12:41.687 HZProject[8483:1091605] timer ---------- 2 2016-03-20 11:12:42.688 HZProject[8483:1091605] timer ---------- 3 2016-03-20 11:12:44.169 HZProject[8483:1091605] -[HZMineGrouponDetailController dealloc] 4 2016-03-20 11:12:46.159 HZProject[8483:1091752] Not get deviceToken yet.
显然,控制器销毁之前我们已经关闭了定时器!
奉上苹果官方文档:NSTimer
尊重作者劳动成果,转载请注明: 【kingdev】