如何实现每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
相关产品推荐
相关产品推荐

