Swift定时器绑定while循环未按预期每秒执行问题求助
解决Timer每秒执行失效的问题
嘿,刚学Swift一周就尝试用Timer做功能,已经超棒啦!咱们来快速定位你的问题~
问题根源
你提到在goldPerSec方法里写了一个while循环,这正是定时器没按预期每秒执行的核心原因!
Timer的工作逻辑依赖主线程的RunLoop:每次到了设定的时间间隔,RunLoop会触发你指定的goldPerSec方法。但如果这个方法里有while循环(尤其是没有退出条件或者循环耗时的情况),会直接阻塞主线程的RunLoop——RunLoop被死死占着,根本没法处理下一次的定时器触发事件,自然就看起来定时器“停了”。
你的代码片段(格式化后)
var timer = Timer() override func viewDidLoad() { super.viewDidLoad() counter() } func counter() { timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.goldPerSec), userInfo: nil, repeats: true) } // 推测你原来的goldPerSec写法 @objc func goldPerSec() { // 这里的while循环会阻塞主线程! while someCondition { // 比如增加金币的操作 } }
正确的写法
Timer本身就是每秒触发一次,所以你根本不需要在方法里加while循环,直接每次触发执行一次你要的逻辑就好:
var timer = Timer() var gold = 0 let targetGold = 100 // 假设你有一个目标金币数 override func viewDidLoad() { super.viewDidLoad() counter() } func counter() { timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(goldPerSec), userInfo: nil, repeats: true) } @objc func goldPerSec() { // 每次定时器触发,执行一次操作 if gold < targetGold { gold += 1 print("当前金币:\(gold)") // 这里放更新UI的操作,比如刷新金币显示标签 } else { // 满足条件后停止定时器,避免浪费资源 timer.invalidate() print("已达到目标金币,定时器停止") } }
额外新手提醒
- 记得给Timer加上
repeats: true(你代码里没写完,应该是漏了),不然定时器只会触发一次。 - 不需要定时器时,一定要调用
timer.invalidate(),避免内存泄漏。 - 所有UI更新操作必须放在主线程,Timer默认在主线程触发,所以直接在
goldPerSec里更新UI是安全的。
内容的提问来源于stack exchange,提问作者Brian Pluhar
相关产品推荐
相关产品推荐

