GCD计时DEMO
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _timeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_timeBtn setBackgroundImage:[UIImage imageNamed:@"short2_apply_btn_disable"] forState:UIControlStateNormal]; [_timeBtn setBackgroundImage:[UIImage imageNamed:@"short2_apply_btn_over"] forState:UIControlStateHighlighted]; [_timeBtn setTitle:@"发送验证码" forState:UIControlStateNormal]; _timeBtn.frame = CGRectMake(100, 100, 150, 30); [_timeBtn addTarget:self action:@selector(starTime) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:_timeBtn]; } - (void)starTime { __block NSInteger timeout = 60; // 倒计时时间 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_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); dispatch_source_set_event_handler(timer, ^{ if (timeout <= 0 ) { dispatch_source_cancel(timer); dispatch_async(dispatch_get_main_queue(), ^{ [_timeBtn setTitle:@"发送验证码" forState:UIControlStateNormal]; _timeBtn.userInteractionEnabled = YES; }); }else{ NSInteger seconds = timeout % 60; NSString *strTime = [NSString stringWithFormat:@"%.2d",seconds]; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"___%@",strTime); [_timeBtn setTitle:[NSString stringWithFormat:@"%@秒后重新发送",strTime] forState:UIControlStateNormal]; _timeBtn.userInteractionEnabled = NO; }); } timeout-- ; }); dispatch_resume(timer); }