在iOS开发中,使用Grand Central Dispatch (GCD)来实现一个60秒的倒计时定时器,可以有效地管理验证码的发送和倒计时显示。以下是一个详细的实现步骤和代码示例,基于我搜索到的资料进行整理和优化。
实现步骤
- 创建定时器:使用dispatch_source_create创建一个定时器。
- 设置定时器:使用dispatch_source_set_timer设置定时器每秒执行一次。
- 事件处理:在事件处理函数中,更新倒计时时间,并根据倒计时时间更新按钮的标题和状态。
- 取消定时器:当倒计时结束时,取消定时器并恢复按钮的初始状态。
代码示例
- (void)startTime:(UIButton *)button {
__block int timeout = 60; // 倒计时时间
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timeNew = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timeNew, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); // 每秒执行
dispatch_source_set_event_handler(timeNew, ^{
if (timeout <= 0) {
// 倒计时结束,关闭定时器
dispatch_source_cancel(timeNew);
dispatch_async(dispatch_get_main_queue(), ^{
[button setTitle:@"获取验证码" forState:UIControlStateNormal];
button.userInteractionEnabled = YES;
button.backgroundColor = [UIColor colorWithRed:44/256.0 green:136/256.0 blue:242/256.0 alpha:1];
});
} else {
NSString *strTime = [NSString stringWithFormat:@"%.2d", timeout];
dispatch_async(dispatch_get_main_queue(), ^{
[button setTitle:[NSString stringWithFormat:@"获取验证码(%@)", strTime] forState:UIControlStateNormal];
button.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(timeNew);
}
详细说明
- __block int timeout = 60;:定义一个块变量timeout,用于存储倒计时时间。
- dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);:创建一个全局队列,用于执行定时器任务。
- dispatch_source_t timeNew = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);:创建一个定时器源。
- dispatch_source_set_timer(timeNew, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0);:设置定时器每秒执行一次。
- dispatch_source_set_event_handler(timeNew, ^{ ... });:设置定时器的事件处理函数,在这里更新倒计时时间和按钮状态。
- dispatch_async(dispatch_get_main_queue(), ^{ ... });:在主线程上更新UI,确保UI操作的安全性。
- dispatch_resume(timeNew);:启动定时器。
注意事项
- 按钮样式:确保按钮的样式设置为UIButtonTypeCustom,以避免刷新标题时出现闪烁。
- 定时器释放:在不需要定时器时,及时取消定时器以避免内存泄漏。
- 后台运行:如果需要在应用进入后台时继续倒计时,可以考虑使用GCD信号量或其他机制来实现。
通过上述步骤和代码示例,可以在iOS应用中实现一个稳定的60秒倒计时定时器,用于发送验证码的功能。