当选择一行时,以下代码设置一组AVAudioPlayer
s以在特定日期播放(在这种情况下,50个玩家以1秒的间隔播放)。
由于我希望在再次触摸时重新启动整个过程,因此需要在for循环中中断设置,因为设置播放器需要几秒钟。
除此之外,使用audioDidFinishPlaying
AVAudioPlayerDelegate
委托方法完成播放后,每个播放器都会被删除。我没有在代码中包含它,因为它与问题无关。
我尝试在for循环中使用一个标志来检查是否允许设置但是不起作用。
var players: [AVAudioPlayer] = []
var loadError: NSError?
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Removes the players that have been setup already.
players.removeAll()
// The for loop from the previous row selection should be stopped here.
for i in 0..<50 {
do {
let player = try AVAudioPlayer(contentsOfURL: soundUrls[i])
players += [player]
// The process of setting these up takes a few seconds, I need to break it.
print("Firing timer")
player.playAtTime(player.deviceCurrentTime + NSTimeInterval(i))
} catch let error as NSError {
loadError = error
}
}
}
发生的情况是,前一行选择触发的设置将继续,直到完成,然后才开始新的for循环。 我需要提前打破它。
我无法弄清楚如何解决这个问题。也许从主线程中删除进程(如何?)?任何帮助非常感谢!
答案 0 :(得分:1)
我对你对这个问题的陈述有点困惑,但无论如何我都会尝试提出一个建议。 您说在选择行时设置了播放器,但设置它们的代码在cellForRowAtIndexPath中。因此,当一个单元格返回并显示在表格视图中时,它会被设置并开始播放。
你到底想要达到什么目的?你有一个包含许多行的表格视图,每当你点击一个单元格时,五十个声音就必须一个接一个地开始播放(相隔1秒)。如果再次点击同一个单元格,它们应该停止并重新启动,是吗?
那么我要做的是在TableViewController的viewDidLoad中设置50个玩家。使用prepareToPlay()。 在需要时启动它们。
然后,如果您需要重新启动它们,只需循环浏览它们,检查它们是否仍在使用isPlaying进行播放。如果需要,暂停它们,将当前时间设置为0并再次调用playAtTime。 不要删除audioDidFinishPlaying中的播放器。因为那时你必须重新创建它们。 只需重置它们即可立即重新播放。
顺便说一句,如果你打算用音频做更多的事情并想要更多的控制和更好的性能,我强烈推荐优秀的框架The Amazing Audio Engine 2,或AudioKit