微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

当选择行时,以下代码设置一组AVAudioPlayers在特定日期播放(在这种情况下,50个玩家以1秒的间隔播放).
由于我想让整个过程在再次触摸时重新启动,所以需要在for循环中打破设置,因为需要几秒钟才能设置播放器.

除此之外,使用AVAudioPlayerDelegate的audioDidFinishPlaying委托方法完成播放后,每个播放器都被删除.我没有将其包含在代码中,因为它与问题无关.

我试过在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循环开始.
我需要更早地打破它.

我不知道如何解决这个问题.也许通过从主线程中删除进程(How?)?任何帮助非常感谢!

解决方法

我对您对这个问题的陈述有些困惑,但是我会尽量给出建议.
你说你在选择一行时设置玩家,但是设置它们的代码是在cellForRowAtIndexPath中.因此,当您的表格视图中返回并显示单元格时,设置和播放开始.

你究竟想要实现什么?你有一个表格视图有多行,每当你点击一个单元格,五十个声音必须开始一个一个地播放(相隔1秒).如果你再次点击相同的单元格,应该停止并重启,是吗?

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

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

顺便说一句,如果你要做更多的音频,想要更多的控制和更好的表现,我强烈推荐优秀的框架惊人的音频引擎2或AudioKit

原文地址:https://www.jb51.cc/iOS/335075.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐