经验拾遗之GCD倒计时按钮

2016-03-22  本文已影响0人  saintPN

  一看就懂demo,地址:github

  在开发中,最常见用到倒计时按钮的场景应该是获取短信的时候,当点击获取后,需要隔一段时间才能再次获取,下面,来用gcd(而不是timer)来实现一下。

1.首先创建一个button,SB或者代码均可,设置好文字和颜色。

2.点击后,用gcd实现倒计时:

__weak  typeof(self) wSelf = self;

//设置倒计时长,注意,在block需要更改对象的话,需要首先用__block声明

int __block time = 10;

self.countdownButton.enabled = NO;

//获取系统全局队列

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);

//设置定时器为点击后马上开始,间隔时间为1秒,没有延迟

dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0), 1*NSEC_PER_SEC, 0);

dispatch_source_set_event_handler(timer, ^{

if (time == 0) {

wSelf.countdownButton.enabled = YES;

dispatch_source_cancel(timer);

dispatch_async(dispatch_get_main_queue(), ^{

wSelf.countdownButton.backgroundColor = [UIColor orangeColor];

[wSelf.countdownButton setTitle:@"点击获取验证短信" forState:UIControlStateNormal];

});

} else {

time --;

NSString *string = [NSString stringWithFormat:@"%d秒后重新获取", time];

dispatch_async(dispatch_get_main_queue(), ^{

wSelf.countdownButton.backgroundColor = [UIColor cyanColor];

[wSelf.countdownButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[wSelf.countdownButton setTitle:string forState:UIControlStateNormal];

});

}

});

//初始状态默认是挂起,创建后必须手动恢复

dispatch_resume(timer);

3.比起timer可能会有的问题,gcd是很好的异步实现方式,简单明了,下面是最终效果:

上一篇下一篇

猜你喜欢

热点阅读