如何让 Swift 中 while 循环的每次迭代立即出现语音?

How can I make speech occur immediately for each iteration of a while loop in Swift?

这是我的游乐场代码:

import AVFoundation


var speechsynth: AVSpeechSynthesizer = AVSpeechSynthesizer()
let wordsToSpeak = ["word one","word two","word three","word four"]

let endTime = NSDate().dateByAddingTimeInterval(10)

while endTime.timeIntervalSinceNow > 0 { 

    //workaround for iOS8 Bug

    var beforeSpeechString : String = " "
    var beforeSpeech:AVSpeechUtterance = AVSpeechUtterance(string: beforeSpeechString)
    speechsynth.speakUtterance(beforeSpeech)

    //realstring to speak
    var speechString: String = wordsToSpeak[0]

    var nextSpeech:AVSpeechUtterance = AVSpeechUtterance(string: speechString)
    nextSpeech.voice = AVSpeechSynthesisVoice(language: "en-US")
    nextSpeech.rate = AVSpeechUtteranceMinimumSpeechRate
    speechsynth.speakUtterance(nextSpeech)
}

目前,在 while 循环完成后开始说话。

我怎样才能让它在每次迭代中说话并在进入下一个循环迭代之前完成说话?

把每一个单词当做一个任务,在Delegate的didFinishSpeechUtterance方法中触发下一个任务。

import UIKit
import AVFoundation

class ViewController: UIViewController, AVSpeechSynthesizerDelegate {

    var queue: dispatch_queue_t = dispatch_queue_create(
        "com.test.whatever.queue", DISPATCH_QUEUE_SERIAL)
    var index: Int = 0
    let words: [String] = ["word one","word two","word three","word four"]
    var speechsynth: AVSpeechSynthesizer = AVSpeechSynthesizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        speechsynth.delegate = self
        self.speechCurrentWord()
    }

    func speechCurrentWord(){
        dispatch_async(queue, { () -> Void in
            var beforeSpeechString : String = " "
            var beforeSpeech:AVSpeechUtterance = AVSpeechUtterance(string: beforeSpeechString)
            self.speechsynth.speakUtterance(beforeSpeech)

            var nextSpeech:AVSpeechUtterance = AVSpeechUtterance(string: self.words[self.index])
            nextSpeech.voice = AVSpeechSynthesisVoice(language: "en-US")
            nextSpeech.rate = AVSpeechUtteranceMinimumSpeechRate
            self.speechsynth.speakUtterance(nextSpeech)
        })
    }

    func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didFinishSpeechUtterance utterance: AVSpeechUtterance!) {
        index++
        if index < self.words.count {
            self.speechCurrentWord()
        }
    }
}