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

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