经验拾遗之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是很好的异步实现方式,简单明了,下面是最终效果:


推荐阅读更多精彩内容

  • 目录(GCD): 关键词 混淆点 场景应用 总结 1. 关键词 线程概念: 独立执行的代码段,一个线程同时间只能执...
    Ryan___阅读 380评论 0 2
  • 转载自:http://www.jianshu.com/p/4ac227e763fa GCD Grand Centr...
    龙战九野阅读 49评论 0 0
  • Dispatch Sources 现代系统通常提供异步接口,允许应用向系统提交请求,然后在系统处理请求时应用可以继...
    YangPu阅读 102评论 0 0
  • 程序中同步和异步是什么意思?有什么区别? 解释一:异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调...
    风继续吹0阅读 530评论 1 2
  • 晴 烈日炎炎蝉不在,但有细蚊耳边碍。 天地万物真难猜,都是希望却不来。 风 新叶沙沙掀裙舞,引的窗边书本怒。 破窗...
    芾彼甘棠阅读 146评论 0 20