Swift中没有数据传递时的完成块语法

时间:2019-06-04 21:32:27

标签: ios swift closures

这很愚蠢,但我无法正常工作。

我想在电话说话之前停止录音。没有数据正在传递。

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 个答案:

答案 0 :(得分:1)

您当前的方法并不十分理想。

首先,AVSpeechSynthesizer提供了一个代表,您可以监视其更改,包括何时讲话。

speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)

只需注意这一点,然后调用stop函数即可。因为它是synchronous函数调用,所以不需要关闭。

总结:

  1. 符合AVSpeechSynthesizerDelegate
  2. 实施speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)
  3. 调用上面的函数时,让它调用您的stopRecording()函数

委托设置示例:

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