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
相关产品推荐
相关产品推荐

