GCD实现验证码倒计时

verifyCode.gif

1 . 新增UIButton的分类UIButton+Categroy 代码如下:

- (void)startTime:(NSInteger)time countDownTitle:(NSString *)countDownTitle;
{
    __block NSInteger timeout = time; // 倒计时时间
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); // 每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        if(timeout <= 0) { // 倒计时结束,关闭
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                // 设置界面的按钮显示
                [self setTitle:@"获取验证码" forState:UIControlStateNormal];
                [self setTitleColor:COLOR_GREEN forState:UIControlStateNormal];
                self.enabled = YES;
                self.layer.borderColor = COLOR_GREEN.CGColor;
            });
        } else {
            NSInteger seconds = timeout;
            NSString *strTime = [NSString stringWithFormat:@"%2ld", seconds];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self setTitle:[NSString stringWithFormat:@"%@ %@s",countDownTitle,strTime] forState:UIControlStateNormal];
                self.enabled = NO;
                [self setTitleColor:Color_Assist_one forState:UIControlStateNormal];
                self.layer.borderColor = Color_Assist_one.CGColor;
            });
            timeout--;
        }
    });
    dispatch_resume(_timer);
}

2 . 代码实现

[button startTime:60 countDownTitle:@"重新获取"];```

GCD与NSTimer 实现本质区别可以阅读这篇文章 [IOS定时器,你真的会用吗?](http://www.jianshu.com/p/c167ca4d1e7e?open_source=weibo_search)

[Demo地址](https://github.com/lebronjames-zh/ZHVerifyCodeCountDown)

你可能感兴趣的:(GCD实现验证码倒计时)