iOS oc 如何用dispatch写一个定时器来实现发送验证码的60秒倒计时

198 阅读2分钟

在iOS开发中,使用Grand Central Dispatch (GCD)来实现一个60秒的倒计时定时器,可以有效地管理验证码的发送和倒计时显示。以下是一个详细的实现步骤和代码示例,基于我搜索到的资料进行整理和优化。

实现步骤

  1. 创建定时器:使用dispatch_source_create创建一个定时器。
  2. 设置定时器:使用dispatch_source_set_timer设置定时器每秒执行一次。
  3. 事件处理:在事件处理函数中,更新倒计时时间,并根据倒计时时间更新按钮的标题和状态。
  4. 取消定时器:当倒计时结束时,取消定时器并恢复按钮的初始状态。

代码示例

- (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秒倒计时定时器,用于发送验证码的功能。