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创建定时器的基本方法就介绍完了

相关文章

  • tableView或者scrollView滑动时 定时器 不响应

    先写解决办法 1. 2. 使用GCD创建定时器。GCD创建定时器不收Runloop的影响,并且GCD的定时器更精准...

  • GCD中的定时器(五)

    一. GCD中定时器的使用方法 创建一个队列 创建一个GCD的定时器 设置定时器的开始时间,间隔时间以及精准度 设...

  • GCD创建定时器的记录

    GCD定时器 在我们的平时开发中经常会用到定时器 ,相对于NSTimer实现的定时器,GCD定时器记录的时间相对要...

  • GCD定时器

    创建GCD定时器 注意:默认创建的定时器对象需要强引用保住它的命,在任务执行中不被释放 定时器操作函数 dispa...

  • GCD定时器的实现

    GCD定时器 GCD定时器不受RunLoop约束,比NSTimer更加准时 证明,实现GCD定时器

  • iOS自定义按钮 - 发送验证码按钮

    效果图 倒计时定时器 使用的是GCD定时器 -- GCD定时器 防止恶意点击 其中设置了倒计时时间记录,无论是p...

  • GCD进入后台继续运行

    iOS GCD创建标准定时器,进入后台后任可继续定时

  • iOS - GCD中的定时器

    GCD定时器优点:① GCD定时器不受RunLoop约束② 比NSTimer更加准时。 GCD定时器用法敲 dis...

  • GCD定时器

    GCD定时器 GCD定时器不受RunLoop的影响,调用频率比较固定

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

网友评论

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

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