You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:27:05