基于GCD的倒计时
2014-11-20 本文已影响1120人
千煌89
源码
+ (void)countDownWithTime:(int)time
countDownBlock:(void (^)(int timeLeft))countDownBlock
endBlock:(void (^)())endBlock
{
__block int timeout = time; //倒计时时间
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);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){ //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
if (endBlock) {
endBlock();
}
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
timeout--;
if (countDownBlock) {
countDownBlock(timeout);
}
});
}
});
dispatch_resume(_timer);
}
例子
- (void)startCount
{
[ZXCountTimeHelper countDownWithTime:60 countDownBlock:^(int timeLeft) {
int seconds = timeLeft % 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
//设置界面的按钮显示 根据自己需求设置
[_getCodeButton setTitle:[NSString stringWithFormat:@"(%@)秒后重新发送",strTime] forState:UIControlStateNormal];
_getCodeButton.enabled = NO;
} endBlock:^(void) {
[_getCodeButton setTitle:@"获取短信验证码" forState:UIControlStateNormal];
_getCodeButton.enabled = YES;
}];
}
12月31日更新
我在ios7上试了一下,倒计时是会卡住的,在ios8上是没问题的,这是_getCodeButton.enabled = YES;
的问题,貌似enabled=NO之后,就不能继续修改了,可以改成userInteractionEnabled。或者大家有更好的解决方法?