如何延迟 For 循环直到声音在 Swift 中播放完毕

Posted

技术标签:

【中文标题】如何延迟 For 循环直到声音在 Swift 中播放完毕【英文标题】:How to Delay a For Loop Until Sound has Finished Playing in Swift 【发布时间】:2016-02-07 03:15:48 【问题描述】:

所以,我有一个 for 循环,它将数组中的值运行到 if 语句中。 if 语句根据数组中的值播放声音。

但是,现在,所有值都在一次运行,所以声音都是同时播放的。这是我的代码现在的样子:

// sortedKeys is an array made from the keys in the newData dictionary.
let sortedKeys = Array(newData.keys).sort(<)

// newData is the dictionary of type [float:float] being used to get the values that are then being run through the if statement.
    for (value) in sortedKeys 
        let data = newData[value]
        if data <= Float(1) 
            self.audioPlayer1.play()
         else if data <= Float(2) && data > Float(1) 
            self.audioPlayer2.play()
         else if data <= Float(3) && data > Float(2) 
            self.audioPlayer3.play()
         else if data <= Float(4) && data > Float(3) 
            self.audioPlayer4.play()
         else if data <= Float(5) && data > Float(4) 
            self.audioPlayer5.play()
         else if data <= Float(6) && data > Float(5) 
            self.audioPlayer6.play()
         else if data <= Float(7) && data > Float(6) 
            self.audioPlayer7.play()
         else if data <= Float(8) && data > Float(7) 
            self.audioPlayer8.play()
         else if data <= Float(9) && data > Float(8) 
            self.audioPlayer9.play()
         else 
            self.audioPlayer10.play()
        
    

我怎样才能做到一旦AVAudioPlayer 完成播放,我继续 for 循环以获得下一个声音?我认为它与AVPlayerItemDidPlayToEndTimeNotification 有关,但我不知道如何使用它来延迟 for 循环。

谢谢!

【问题讨论】:

你能解释一下你想在这里做什么吗? for-loop 将快速执行并遍历数组中的所有值。对于您要完成的工作,这可能是错误的工具。而AVPlayerItemDidPlayToEndTimeNotification 指的是AVPlayer 而不是AVAudioPlayer 【参考方案1】:

我怎样才能做到一旦 AVAudioPlayer 完成播放,然后我继续 for 循环以获得下一个声音。

让音频播放器的代理实现-audioPlayerDidFinishPlaying:successfully:,以便它选择下一个声音并播放它。

音频是异步播放的,因此您不能在播放声音时让代码暂停一会儿然后继续播放。你需要设计你的代码,让它发出声音,然后当音频播放器说它完成时,开始下一个声音。

【讨论】:

嗨!感谢您的回答!我对这个audioPlayerDidFinishPlaying 很陌生。我将如何在我的代码中实现这一点? 如果您是 delegation 的新手,请先阅读 Apple 的文档。一旦你理解了这一点,你就会选择一些对象(通常是一个视图控制器)作为音频播放器的代理。该对象将需要实现来自AVAudioPlayerDelegate 的方法。将该对象分配给音频播放器的delegate,您的方法将被调用。【参考方案2】:

我遇到了类似的问题并使用了睡眠(插入暂停秒数),例如在 self.audioPlayer.play() 函数之后的 sleep(3) 函数,以便让播放函数有时间播放。这并不理想,因为它阻塞了主线程。

【讨论】:

以上是关于如何延迟 For 循环直到声音在 Swift 中播放完毕的主要内容,如果未能解决你的问题,请参考以下文章

Swift:for循环中延迟的动画不起作用?

JQuery 不播放多个声音文件或延迟事件

Android声音播放延迟到while循环结束

延迟显示 UIMapView 直到地图在 Swift 中完全加载

如何使用 for 循环在 Matlab 中读取许多声音文件?

如何创建一个循环来检查每次迭代时是不是有新的 IBAction 输入?