由于我想让整个过程在再次触摸时重新启动,所以需要在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
总结以上是内存溢出为你收集整理的ios – 在for循环中停止使用playAtTime()设置多个AVAudioPlayers全部内容,希望文章能够帮你解决ios – 在for循环中停止使用playAtTime()设置多个AVAudioPlayers所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)