基于GCD的倒计时

源码


+ (void)countDownWithTime:(int)time
           countDownBlock:(void (^)(int timeLeft))countDownBlock
                 endBlock:(void (^)())endBlock
{
    __block int 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(), ^{
                if (endBlock) {
                    endBlock();
                }
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                timeout--;
                if (countDownBlock) {
                    countDownBlock(timeout);
                }
            });     
        }
    });
    dispatch_resume(_timer);
}

例子


- (void)startCount
{
    [ZXCountTimeHelper countDownWithTime:60 countDownBlock:^(int timeLeft) {
        int seconds = timeLeft % 60;
        NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
        //设置界面的按钮显示 根据自己需求设置
        [_getCodeButton setTitle:[NSString stringWithFormat:@"(%@)秒后重新发送",strTime] forState:UIControlStateNormal];
        _getCodeButton.enabled = NO;
    } endBlock:^(void) {
        [_getCodeButton setTitle:@"获取短信验证码" forState:UIControlStateNormal];
        _getCodeButton.enabled = YES;
    }];
}

12月31日更新


我在ios7上试了一下,倒计时是会卡住的,在ios8上是没问题的,这是_getCodeButton.enabled = YES;的问题,貌似enabled=NO之后,就不能继续修改了,可以改成userInteractionEnabled。或者大家有更好的解决方法?

你可能感兴趣的:(基于GCD的倒计时)