Синтаксис блока завершения при отсутствии данных в Swift - PullRequest
0 голосов
/ 05 июня 2019

Это просто глупо, но я не могу заставить его работать.

Я хочу остановить запись, прежде чем телефон что-то скажет.Данные не передаются.

let words = "Hello world"
let utt =  AVSpeechUtterance(string:words)
stopRecordingWithCompletion() {
    voice.speak(utt) 
}

func stopRecordinWithCompletion(closure: () -> Void) {
   recognitionRequest?.endAudio()
    recognitionRequest = nil
    recognitionTask?.cancel()
    recognitionTask = nil      
    let inputNode = audioEngine.inputNode
    let bus = 0
    inputNode?.removeTap(onBus: bus)
    self.audioEngine.stop()
    closure()
}

Что я делаю не так?

1 Ответ

1 голос
/ 05 июня 2019

Ваш нынешний подход на самом деле не идеален для этого.

Для начала, AVSpeechSynthesizer предоставляет делегата, которого вы можете отслеживать за изменениями, в том числе когда он собирается выступить.

speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)

Просто соблюдайте это и вызывайте функцию остановки.Закрытие не требуется, поскольку это синхронный вызов функции .

В итоге:

  1. Соответствует AVSpeechSynthesizerDelegate
  2. Реализация speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)
  3. Когда вызывается указанная выше функция, вызовите ее stopRecording() function

Пример настройки делегата:

extension YourClassHere: AVSpeechSynthesizerDelegate {
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                           willSpeakRangeOfSpeechString characterRange: NSRange,
                           utterance: AVSpeechUtterance) {
        stopRecording()
    }
}
...