如何延迟 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 中播放完毕的主要内容,如果未能解决你的问题,请参考以下文章
延迟显示 UIMapView 直到地图在 Swift 中完全加载