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

如何实现每10秒播放一次音效?附Swift计时器代码求助

实现计时器每10秒播放音效的修改方案

你的当前代码仅会在计时到第10秒时播放一次音效,无法实现每10秒重复播放的需求,以下是修改方案:

核心修改要点

  • 调整触发条件:用取余运算time5 % 10 == 0替代time5 == 10,这样每到10、20、30...秒时都会触发音效。
  • 优化音频播放器初始化:避免每次播放都重新创建AVAudioPlayer实例,提前初始化并复用,提升性能并避免加载延迟。
  • 增加计时器重置逻辑:防止重复点击启动按钮导致多个计时器同时运行。

修改后的完整代码

import AVFoundation

class ViewController: UIViewController {
    var timer3: Timer?
    var time5 = 0
    @IBOutlet weak var timer: UILabel!
    var player: AVAudioPlayer? // 类级别变量,复用播放器实例

    @IBAction func startBtn(_ sender: UIButton) {
        // 重置现有计时器与计时数值
        timer3?.invalidate()
        time5 = 0
        timer.text = "0"
        
        timer3 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(action8888), userInfo: nil, repeats: true)
    }

    @objc func action8888() {
        time5 += 1
        timer.text = String(time5)
        
        // 每10秒触发音效播放
        if time5 % 10 == 0 {
            // 首次播放时初始化播放器
            if player == nil {
                guard let soundURL = Bundle.main.url(forResource: "mixkit-system-beep-buzzer-fail-2964", withExtension: "wav") else {
                    print("音效文件未找到,请检查文件名和路径")
                    return
                }
                do {
                    player = try AVAudioPlayer(contentsOf: soundURL)
                    player?.prepareToPlay() // 提前加载音频,减少播放延迟
                } catch {
                    print("音频播放器初始化失败:\(error.localizedDescription)")
                }
            }
            player?.play()
        }
    }
    
    // 页面销毁时清理计时器和播放器
    deinit {
        timer3?.invalidate()
        player?.stop()
        player = nil
    }
}

额外说明

  • 加入了错误处理逻辑,避免因文件缺失或初始化失败导致崩溃。
  • 在deinit方法中清理计时器和播放器,避免内存泄漏。
  • 使用prepareToPlay()提前准备音频数据,让音效播放更流畅。

内容的提问来源于stack exchange,提问作者Kaleb Zimmerman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:48:11