当选择行时,以下代码设置一组AVAudioPlayers在特定日期播放(在这种情况下,50个玩家以1秒的间隔播放).
由于我想让整个过程在再次触摸时重新启动,所以需要在for循环中打破设置,因为需要几秒钟才能设置播放器.
由于我想让整个过程在再次触摸时重新启动,所以需要在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循环开始.
我需要更早地打破它.
解决方法
我对您对这个问题的陈述有些困惑,但是我会尽量给出建议.
你说你在选择一行时设置玩家,但是设置它们的代码是在cellForRowAtIndexPath中.因此,当您的表格视图中返回并显示单元格时,设置和播放开始.
你说你在选择一行时设置玩家,但是设置它们的代码是在cellForRowAtIndexPath中.因此,当您的表格视图中返回并显示单元格时,设置和播放开始.
你究竟想要实现什么?你有一个表格视图有多行,每当你点击一个单元格,五十个声音必须开始一个接一个地播放(相隔1秒).如果你再次点击相同的单元格,应该停止并重启,是吗?
那么我会做的是在TableViewController的viewDidLoad中设置50个玩家.使用prepareToPlay().
需要时启动它们
那么如果你需要重新启动它们,只需循环浏览它们,检查它们是否仍在使用isPlaying播放.暂停它们,如果需要,将当前时间设置为0并再次调用playAtTime.
不要删除audioDidFinishPlaying中的播放器.因为那时你必须重新创建它们.
只需重置它们,以便它们可以再次立即播放.
顺便说一句,如果你要做更多的音频,想要更多的控制和更好的表现,我强烈推荐优秀的框架惊人的音频引擎2或AudioKit