如何为Swift循环的每次迭代添加延迟?现有方案问题分析
问题分析与解决方案
为什么你的代码无效?
你遇到的问题核心在于:你的for循环是同步执行的。当循环运行时,它会在极短的时间内把10个delay(1)任务全部提交给主队列,每个任务都被安排在“当前时间+1秒”后执行。这就导致1秒后,所有10个闭包会几乎同时触发,count会一下子从0跳到10,而不是每秒递增1。
解决方案1:递归实现间隔执行
这种方法通过递归调用,确保上一次延迟执行完成后,再安排下一次的任务,真正实现每秒递增:
var count = 0 func incrementCountSequentially(remaining: Int) { guard remaining > 0 else { return } delay(1) { count += 1 print("当前count值:\(count)") // 验证每秒输出一次 self.incrementCountSequentially(remaining: remaining - 1) } } // 启动执行,总共执行10次 incrementCountSequentially(remaining: 10)
解决方案2:使用Timer定时器
如果你的场景更适合用定时器,这种方式代码更直观,也容易控制启停:
var count = 0 var incrementTimer: Timer? // 启动定时器,每秒触发一次 incrementTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in count += 1 print("当前count值:\(count)") // 达到10次后停止定时器 if count >= 10 { timer.invalidate() incrementTimer = nil // 避免引用循环 } }
解决方案3:用Async/Await(Swift 5.5+)
如果你的项目支持Swift 5.5及以上版本,用异步等待的方式会更简洁易读:
首先把你的延迟函数改成支持async的版本:
func delay(_ delay: Double) async { try? await Task.sleep(nanoseconds: UInt64(delay * Double(NSEC_PER_SEC))) }
然后用异步循环实现:
var count = 0 Task { for _ in 0...9 { await delay(1) count += 1 print("当前count值:\(count)") } }
这里的异步循环会等待每次延迟完成后,再进入下一次迭代,完美实现每秒递增的效果。
内容的提问来源于stack exchange,提问作者George_E -old
相关产品推荐
相关产品推荐

