我有一个我正在处理的音频应用程序,它播放前景和背景(锁定屏幕)中的音频文件列表。我在后台播放音频播放列表时遇到问题。
下面是我循环播放下一个播放列表后的一个音频文件的功能。我似乎每次都遇到我的cellForItem问题。如果我不打开它,我会收到一个致命的错误。如果我将它放在if let语句中,则在播放下一首歌曲时,代码不会在下一次重复时运行。我从来没有丢失indexPath所以它应该工作得很好。我无法理解。
func playCellAudioInBackground(indexPath: IndexPath) {
if let item = cv.cellForItem(at: indexPath) as? CollectionViewCell {
let when = DispatchTime.now() + 3 // change 2 to desired number of seconds
DispatchQueue.main.asyncAfter(deadline: when) {
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: [], animations: ({
self.gradient.removeFromSuperlayer()
item.superview?.bringSubview(toFront: item)
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}), completion: { (finished: Bool) in
let audioURL = self.streams[indexPath.item][“audioURL"] as? String
let isLive = self.streams[indexPath.item]["isLive"] as? Bool
self.audioStreamSelected(audioUrl: audioURL!, live:isLive!) { (success) -> Void in
DispatchQueue.main.async {
self.audioPlay()
}
}
})
}
}
}
答案 0 :(得分:1)
两件重要的事情:
您不应在主线程中播放或流式传输音频。使用此线程进行简短操作,但主要用于UI更新。
当应用程序从前台移动到后台时,您必须运行后台任务才能继续播放音频。
查看this整洁的教程,他们会精确地教你{{1}}以及如何在后台播放音频。
我希望这有帮助!