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

Swift:如何实现可暂停代码执行流程的定时器(非sleep/闭包)

关于Timer的执行逻辑与同步暂停实现

一、你写的scheduledTimer会让代码暂停吗?

不会。Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: false)这种定时器是异步触发的,它只会被加到当前线程的RunLoop里,等10秒后再调用fireTimer方法,但完全不会卡着当前代码不往下走——定时器创建语句之后的代码会立刻继续运行。

二、不用sleep/闭包实现代码流程暂停10秒的方案

可以通过手动控制RunLoop配合定时器来实现,具体代码如下:

// 用一个标记变量控制RunLoop退出
var timerTriggered = false

// 创建定时器(不自动加入RunLoop)
let timer = Timer(timeInterval: 10.0, target: self, selector: #selector(onTimerTriggered), userInfo: nil, repeats: false)
// 把定时器添加到当前RunLoop
RunLoop.current.add(timer, forMode: .common)

// 让RunLoop持续运行,直到定时器触发
while !timerTriggered {
    // 每次运行0.1秒,避免完全阻塞线程
    RunLoop.current.run(until: Date().addingTimeInterval(0.1))
}

// 定时器触发的回调方法
@objc func onTimerTriggered() {
    timerTriggered = true
}

原理说明:

  • 不用scheduledTimer自动添加定时器,而是手动创建并加到RunLoop,这样能精准控制RunLoop的运行逻辑。
  • 通过while循环让当前RunLoop反复运行小段时间,直到定时器触发后修改标记变量,退出循环,这样当前代码流程就会暂停10秒。
  • 和sleep不同,这种方式下RunLoop在等待期间还能处理其他事件(比如UI刷新),但对当前代码执行流来说,是同步暂停的效果。

内容的提问来源于stack exchange,提问作者Tony Yao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:15:36