自己写了个NSObject的扩展,使用GCD方式实现倒计时功能,不多说了,直接上代码
.h文件
/**
* 处理倒计时停止的回调
*/
typedef void(^HandleStopCountdownBlock)(NSString *stopTime);
/**
* 处理倒计时改变的回调
*/
typedef void(^HandleChangeCountdownBlock)(NSString *changeTime);
@interface NSObject (GCD)
/**
* GCD定时器(倒计时)
*
* param Timeout 倒计时开始时间
* param handleChangeCountdownBlock 倒计时时间改变回调
* param handleStopCountdownBlock 倒计时时间停止回调
*/
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock;
.m文件
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock
{
__blockNSInteger timeout = Timeout;//倒计时时间
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 (handleStopCountdownBlock)
{
NSString *timeoutStr = [NSStringstringWithFormat:@"%ld",timeout];
handleStopCountdownBlock(timeoutStr);
}
});
}else{
NSInteger minutes;
NSInteger seconds;
NSString *strTime;
if (timeout >60)
{
minutes = timeout / 60;
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld分%.2ld秒后重新获取验证码",(long)minutes, (long)seconds];
}
else
{
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld秒后重新获取验证码",(long)seconds];
}
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示根据自己需求设置
if (handleChangeCountdownBlock)
{
handleChangeCountdownBlock(strTime);
}
});
timeout--;
}
});
//启动
dispatch_resume(_timer);
return _timer;
}