Я пытаюсь синхронизировать воспроизведение слайдов в UICollectionView с воспроизведением аудиофайла.То, что я пытаюсь сделать, это сначала воспроизвести аудио, дождаться его завершения, прежде чем перейти к следующему слайду, где процесс повторяется.Проблема в том, что слайд сначала прокручивается, а затем воспроизводится аудиофайл, т.е. он не синхронизируется.
Я пытался сделать это, внедрив таймер, а затем синхронизировав порядок воспроизведения звука и затем прокручивая слайды с помощью методов dispatchQueue.Однако я не могу заставить его полностью синхронизироваться.Я проверил другие ответы в StackOverFlow, в том числе: Ожидание завершения задачи .И я вижу, что одна из основных проблем заключается в том, что приложение должно распознавать, когда аудиофайл закончился, а не только когда он начался.Чтобы обойти это, я посмотрел на функцию - swift.AVPlayer.Как отследить, когда песня закончилась? .Однако я не могу интегрировать это.Буду благодарен за любую помощь.
Это функция таймера:
func startSlideTimer() {
timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.scrollAutomatically), userInfo: nil, repeats: true)
}
scroll. Автоматически это:
@objc func scrollAutomatically() {
if let scrollCollectionView = collectionView {
for cell in scrollCollectionView.visibleCells {
let indexPath = scrollCollectionView.indexPath(for: cell)!
print("Scroll indexPath is \(indexPath)")
let group = DispatchGroup()
group.enter()
DispatchQueue.main.async {
self.playAVatIndex()
if self.audioFinished == true {
group.leave()
} *** This does not work
}
group.notify(queue: .main) {
if (indexPath.row < (self.selectedStory?.storyItems.count)! - 1) {
let indexPath1: IndexPath?
indexPath1 = IndexPath.init(row: (indexPath.row) + 1, section: (indexPath.section))
scrollCollectionView.scrollToItem(at: indexPath1!, at: .right, animated: true)
}
else {
self.stopTimer()
}
}
}
}
}
Функция воспроизведения аудиофайла здесь:
@objc func playAVatIndex() {
if let scrollCollectionView = collectionView {
for cell in scrollCollectionView.visibleCells {
let indexPath = scrollCollectionView.indexPath(for: cell)!
let storyItem = selectedStory!.storyItems[indexPath.row]
setUpPlayer(storyItem: storyItem)
audioPlayer.play()
}
}
}
функция определения конца игры:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
print("Finished playing")
audioFinished = true *** assigned to relevant global variable
}
Заранее спасибо за любую помощь в этом.