先上代码:
-(void)setupCountDown{
__block int timeout=60;
@weakify(self);
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||isCancel){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
@strongify(self);
self.buttonForSendVerifyCode.enabled = YES;
[self.buttonForSendVerifyCode setTitle:@”发送验证码” forState:UIControlStateNormal];
self.buttonForSendVerifyCode.userInteractionEnabled = YES;
});
}else{
int seconds = (timeout-1) % 60;
NSString *strTime = [NSString stringWithFormat:@”%.2d”, seconds];
dispatch_async(dispatch_get_main_queue(), ^{
@strongify(self);
self.buttonForSendVerifyCode.enabled = NO;
[self.buttonForSendVerifyCode setTitle:[NSString stringWithFormat:@”再次获取(%@秒)”,strTime] forState:UIControlStateNormal];
self.buttonForSendVerifyCode.userInteractionEnabled = NO;
self.buttonForSendVerifyCode.titleLabel.lineBreakMode = 0;
});
timeout–;
}
});
dispatch_resume(_timer);
}
以上:
1、dispatch_get_global_queue(long identifier, unsigned long flags);用于获取全局的队列,identifier指定优先级,flags为保留字段,一般置为0;
2、dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); 表示每隔1秒执行一次,误差时间为0;
3、dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 提交一个异步执行的block到一个dispatch队列,并且立即执行。适用于block很费时的操作,用异步不会影响主线程的UI操作。