iOS实战——GCD实现时间倒数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maple_ROSI/article/details/52849319
  • UILabel显示倒数
/**
 *  倒计时GCD通用方法
 *  通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不佳,使用GCD计时相对更好
 *
 *  @param seconds   倒计时间 单位:秒
 *  @param showLable 需要显示的文本框
 *  @param endBlock  倒计时结束后,回调的Block
 */
+ (void)startTimerWithSeconds:(long)seconds showLable:(UILabel *)showLable endBlock:(void (^)())endBlock
{
    [self startTimerWithSeconds:seconds showLable:showLable strFormat:nil endBlock:endBlock];
}

调下如下:

[BSTool startTimerWithSeconds:remainTime showLable:self.countdownLable endBlock:^{
                self.countdownLable.text = @"订单超时";
                [weakSelf.tableView reloadData];
            }];
  • UILabel 格式显示倒数,并且倒数完成后需要进行另外的操作,则需要用block回调
/**
 *  倒计时GCD通用方法
 *  通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不佳,使用GCD计时相对更好
 *
 *  @param seconds   倒计时间 单位:秒
 *  @param strFormat 格式化样式,如 "剩%@自动关闭"
 *  @param showLable 需要显示的文本框
 *  @param endBlock  倒计时结束后,回调的Block
 */
+ (void)startTimerWithSeconds:(long)seconds showLable:(UILabel *)showLable strFormat:(NSString *)format endBlock:(void (^)())endBlock
{
    __block long timeout = seconds; // 倒计时时间
    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){ // 倒计时结束,回调block
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                if (endBlock) {
                    endBlock();
                }
            });
        } else{

            NSString *strTime = [NSString stringWithFormat:@"%02ld分%02ld秒",(long)(timeout % 3600 / 60), (long)(timeout  % 60)];
            //回到主界面,显示倒计时
            dispatch_async(dispatch_get_main_queue(), ^{
                if (format) { // 判断是否要格式化
                    showLable.text = [NSString stringWithFormat:format,strTime];
                } else {
                    showLable.text = strTime;
                }
            });

            timeout--;
        }
    });

    dispatch_resume(_timer);
}

调用如下:

[BSTool startTimerWithSeconds:payResultModel.remainTime
                            showLable:self.payStateDescLabel
                            strFormat:@"剩%@自动关闭"
                             endBlock:^{
                                 self.payStateDescLabel.text = @"交易关闭";
                             }];
  • 获取短信验证码按钮倒数
// MARK:倒计时
- (void)setTimer {
    __block int timeout = 60;
    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(), ^{
                sendCode.userInteractionEnabled = YES;
                [sendCode setTitle:@"获取验证码" forState:UIControlStateNormal];
                [sendCode setTitleColor:Color_A1A1A1 forState:UIControlStateNormal];
            });
        }
        else {
            int seconds = timeout % 61;
            NSString *strTime = [NSString stringWithFormat:@"%.2d",seconds];
            dispatch_async(dispatch_get_main_queue(), ^{
                [sendCode setTitleColor:Color_A1A1A1 forState:UIControlStateNormal];
                [sendCode setTitle:[NSString stringWithFormat:@"%@秒",strTime] forState:UIControlStateNormal];
                sendCode.userInteractionEnabled = NO;
            });
            timeout--;
        }
    });
    dispatch_resume(_timer);

}

猜你喜欢

转载自blog.csdn.net/Maple_ROSI/article/details/52849319
今日推荐