经验拾遗之GCD倒计时按钮
一看就懂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是很好的异步实现方式,简单明了,下面是最终效果: