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

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