GCD创建定时器的记录

作者: Devbrave | 来源:发表于2016-10-18 11:23 被阅读81次
    GCD定时器

    在我们的平时开发中经常会用到定时器 ,相对于NSTimer实现的定时器,GCD定时器记录的时间相对要精确一些。而且不用考虑内存释放的问题。

    以下是GCD实现基本的获取验证码的倒计时功能
    直接上代码了

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.but = [[UIButton alloc] initWithFrame:CGRectMake(self.view.center.x, self.view.center.y, 100, 50)];
    //    self.but.backgroundColor = [UIColor redColor];
        [self.but setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
        [self.but setTitle:@"获取验证码" forState:UIControlStateNormal];
        self.but.titleLabel.font = [UIFont systemFontOfSize:15];
        [self.but addTarget:self action:@selector(tapClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:self.but];
    }
    
    - (void)tapClick:(UIButton*)but{
    
        [self playGCDTimer];
    }
    
    - (void)playGCDTimer{
        
        __block NSInteger time = 59;
        //全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        //创建timer 类型的定时器 (DISPATCH_SOURCE_TYPE_TIMER)
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
        //设置定时器的各种属性(何时开始,间隔多久执行)
        // GCD 的时间参数一般为纳秒 (1 秒 = 10 的 9 次方 纳秒)
        // 指定定时器开始的时间和间隔的时间
        dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
        
        //任务回调
        dispatch_source_set_event_handler(timer, ^{
            
            if (time <= 0) {
                
                dispatch_source_cancel(timer);//关闭定时器
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    [self.but setTitle:@"重新发送" forState:UIControlStateNormal];
                    self.but.userInteractionEnabled = YES;
                    
                });
            }else{
                
                int seconds = time % 60;
                dispatch_sync(dispatch_get_main_queue(), ^{
                   
                    [self.but setTitle:[NSString stringWithFormat:@"重新发送(%.2d)",seconds] forState:UIControlStateNormal];
                    self.but.userInteractionEnabled = NO;//验证码获取时禁止用户点击
                });
            }
            time--;
        });
        
        // 开始定时器任务(定时器默认开始是暂停的,需要复位开启)
        dispatch_resume(timer);
    }
    

    好了GCD创建定时器的基本方法就介绍完了

    相关文章

      网友评论

        本文标题:GCD创建定时器的记录

        本文链接:https://www.haomeiwen.com/subject/hezzyttx.html