Как дождаться завершения аудио в SwiftUI? - PullRequest
1 голос
/ 18 июня 2020

Все, что я хочу, это подождать, пока звук не закончится, и вызвать следующий звук ...

Это основная функция в ConentView struct, которую я использую для воспроизведения звуки с обработчиками:

func askNew(){

        self.isPlaying = true
        playQuestion{ 
        //1st audio
            askNew{
            //2nd audio to play

                //Change the global @State to see the result
                self.isPlaying = false
            }

        }

    }
}

Небольшие функции для воспроизведения звуков. Очевидно, они сообщают нам, только если аудиосеанс начинается, но не дожидаются окончания.

// MARK: - Question
func playQuestion(finished: () -> Void) {
   GSAudio.sharedInstance.playSound(sound: "question", type: "mp3", loop: false)
   finished()
}

func askNewSetCurrent(finished: () -> Void){
   GSAudio.sharedInstance.playSound(sound: "next_sound", type: "mp3", loop: false)
   finished()
}

1 Ответ

1 голос
/ 19 июня 2020

Попробуйте так думать

import AVFoundation

class SwiftUIViewModel: NSObject, ObservableObject {
    private var avPlayer: AVAudioPlayer!
    private var arrayOfAllTracks = [Track]()

    // call play track from view
    func playTrack() {
        self.play(track: arrayOfAllTracks[0])
    }

    private func play(track: Track) {
        self.avPlayer = try! AVAudioPlayer(contentsOf: track.url, fileTypeHint: AVFileType.mp3.rawValue)

        self.avPlayer?.delegate = self

        avPlayer.play()
    }

    private func playNext() {
        let track = self.arrayOfAllTracks[1]
        self.play(track: track)
    }
}

extension SwiftUIViewModel: AVAudioPlayerDelegate {
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        guard flag else { return }

        self.playNext()
    }
}

struct Track {
    let url: URL!
}
...