non*_*tic 12 for-loop avaudioplayer ios swift
当选择一行时,以下代码设置一组AVAudioPlayers以在特定日期播放(在这种情况下,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
}
}
}
Run Code Online (Sandbox Code Playgroud)
发生的情况是,前一行选择触发的设置将继续,直到完成,然后才开始新的for循环.我需要提前打破它.
我无法弄清楚如何解决这个问题.也许从主线程中删除进程(如何?)?任何帮助非常感谢!
小智 1
我对你对问题的陈述有点困惑,但无论如何我会尝试给出建议。您说您在选择一行时设置了玩家,但设置它们的代码位于 cellForRowAtIndexPath 中。因此,当单元格返回并显示在表格视图中时,它就已设置完毕并开始播放。
您究竟想要实现什么目标?您有一个包含多行的表格视图,每当您点击一个单元格时,五十个声音就必须开始一个接一个地播放(间隔 1 秒)。如果您再次点击同一个单元格,它们应该停止并重新启动,是这样吗?
然后我要做的就是在 TableViewController 的 viewDidLoad 中设置 50 个玩家。使用prepareToPlay()。在需要时启动它们。
然后,如果您需要重新启动它们,只需循环浏览它们,使用 isPlaying 检查它们是否仍在播放。如果需要,暂停它们,将当前时间设置为 0 并再次调用 playAtTime。不要删除audioDidFinishPlaying 中的播放器。因为那样你就必须重新创建它们。只需重置它们即可再次立即播放。
顺便说一句,如果您打算对音频做更多的事情并想要更多的控制和更好的性能,我强烈推荐优秀的框架 The Amazing Audio Engine 2 或 AudioKit
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |