Swift for循环中每执行3次触发指定操作的实现方案咨询
适配自定义轮次规则的定时执行实现
原代码问题梳理
- 同步遍历的for循环和创建的GCD定时器完全无关联,定时器未配置触发间隔、事件回调,实际不会执行任何定时任务
- 内置的分支判断逻辑不匹配需求的轮次规则:你要求1、2、3、4次为第1轮,5次为第2轮,6次为第3轮,原判断逻辑完全不符合规则
- 循环范围硬编码为
0...12,未使用传入的rep参数,也无法适配≥6次的通用场景
修正后可运行代码
func duration(interval: Double, rep: Int) { // 校验参数合法性,要求总次数≥6 guard rep >= 6 else { print("总执行次数需≥6") return } let queue = DispatchQueue.main let timer = DispatchSource.makeTimerSource(queue: queue) // 配置定时器触发间隔 timer.schedule(deadline: .now(), repeating: interval) var executeCount = 0 timer.setEventHandler { executeCount += 1 // 按轮次规则执行对应操作 switch executeCount { case 1...4: print("第1轮,第\(executeCount)次执行:执行对应操作") case 5: print("第2轮,第\(executeCount)次执行:执行对应操作") case 6: print("第3轮,第\(executeCount)次执行:执行对应操作") default: print("第\(executeCount/3 + 1)轮,第\(executeCount)次执行:执行对应操作") } // 每执行3次触发指定操作 if executeCount % 3 == 0 { print("=== 每3次触发的指定操作执行 ===") } // 达到总执行次数后取消定时器 if executeCount == rep { timer.cancel() print("定时器已停止,总执行次数:\(executeCount)") } } // 启动定时器 timer.resume() }
逻辑说明
- 计数从1开始,完全匹配你给出的轮次划分规则,6次之后的轮次可根据业务需求自行调整计算规则
- 内置
executeCount % 3 == 0的判断,实现每执行3次触发指定操作的需求,天然适配所有总次数≥6的场景 - 替换了原代码无效的同步for循环,使用定时器的事件回调处理计数和业务逻辑,符合定时执行的使用场景
- 总执行次数由传入的
rep参数控制,支持自定义配置
内容的提问来源于stack exchange,提问作者user16856881
相关产品推荐
相关产品推荐

