iOS 倒计时按钮--- 程序进入后台也会倒计时

Tip:这篇文章笔者还未接触Markdown语言所做笔记。直接复制代码请点击->源代码Copy不报错



前言:前段时间,测试同事测试出一个问题。那就是手机号注册码发送以后,发送按钮进入倒计时,而后将程序退入后台,当过了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); } 

你可能感兴趣的:(iOS 倒计时按钮--- 程序进入后台也会倒计时)