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

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("已达到目标金币,定时器停止")
    }
}

额外新手提醒

  1. 记得给Timer加上repeats: true(你代码里没写完,应该是漏了),不然定时器只会触发一次。
  2. 不需要定时器时,一定要调用timer.invalidate(),避免内存泄漏。
  3. 所有UI更新操作必须放在主线程,Timer默认在主线程触发,所以直接在goldPerSec里更新UI是安全的。

内容的提问来源于stack exchange,提问作者Brian Pluhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:32