前言:前段时间,测试同事测试出一个问题。那就是手机号注册码发送以后,发送按钮进入倒计时,而后将程序退入后台,当过了5分钟以后。NSTimer就显示的时间没有改变。还有一种不和逻辑的现象就是:时间会乱序。一会5s 一会7s. (-_-)当然了这个问题是我没控制好NSTimer 的NSRunloop。 为了避免这种复杂的要注意点,我采用了GCD里边的信号量来做倒计时按钮。其一:在后台也进程也不会中断,会按照物理时间继续减少秒数。其二:完全避免了会乱序的情况。 废话不多说,上代码。
- (void)countDownBegin:(UIButton *)sender{
NSTimeInterval seconds =60;
NSDate *endTime = [NSDate dateWithTimeIntervalSinceNow:seconds];// 最后期限
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_source_t _sometimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue);
dispatch_source_set_timer(_sometimer, dispatch_walltime(NULL,0),1.0*NSEC_PER_SEC,0);// 每秒执行一次
dispatch_source_set_event_handler(_sometimer, ^{
int interval = [endTime timeIntervalSinceNow];
if(interval >0) {// 更新倒计时
NSString *timeStr = [NSString stringWithFormat:@"%ds", interval];
dispatch_async(dispatch_get_main_queue(), ^{
[sender setTitle:timeStr forState:UIControlStateNormal]; sender.userInteractionEnabled =NO;
[sender setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
});
}else{
// 倒计时结束,关闭
dispatch_source_cancel(_sometimer);
dispatch_async(dispatch_get_main_queue(), ^{
[sender setTitle:@"获取验证码"forState:UIControlStateNormal];
[sender setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; sender.userInteractionEnabled =YES;
});
}
});
dispatch_resume(_sometimer);
}
网友评论