停止在for循环中使用playAtTime()设置多个AVAudioPlayers

时间:2016-10-04 09:28:15

标签: ios swift for-loop avaudioplayer

当选择一行时,以下代码设置一组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循环。 我需要提前打破它。

我无法弄清楚如何解决这个问题。也许从主线程中删除进程(如何?)?任何帮助非常感谢!

1 个答案:

答案 0 :(得分:1)

我对你对这个问题的陈述有点困惑,但无论如何我都会尝试提出一个建议。 您说在选择行时设置了播放器,但设置它们的代码在cellForRowAtIndexPath中。因此,当一个单元格返回并显示在表格视图中时,它会被设置并开始播放。

你到底想要达到什么目的?你有一个包含许多行的表格视图,每当你点击一个单元格时,五十个声音就必须一个接一个地开始播放(相隔1秒)。如果再次点击同一个单元格,它们应该停止并重新启动,是吗?

那么我要做的是在TableViewController的viewDidLoad中设置50个玩家。使用prepareToPlay()。 在需要时启动它们。

然后,如果您需要重新启动它们,只需循环浏览它们,检查它们是否仍在使用isPlaying进行播放。如果需要,暂停它们,将当前时间设置为0并再次调用playAtTime。 不要删除audioDidFinishPlaying中的播放器。因为那时你必须重新创建它们。 只需重置它们即可立即重新播放。

顺便说一句,如果你打算用音频做更多的事情并想要更多的控制和更好的性能,我强烈推荐优秀的框架The Amazing Audio Engine 2,或AudioKit