Похоже, это связано с внутренней AVSpeechSynthesizer
очередью.Вы можете попытаться заставить его управлять вещами в фоновом режиме, так как нет упоминания о том, что AVSpeechSynthesizer
является только основным потоком.Сделайте это, добавив вызов последней строки (synthesizer.speak(utterance)
) в фоновую очередь, собирая ссылки на такие объекты synthesizer
и utterance
:
DispatchQueue.global(qos: .background).async {
synthesizer.speak(utterance)
}
Я думаю, причина, по которой вы заблокировали пользовательский интерфейспотому что synthesizer
экземпляр должен блокировать текущий поток, чтобы говорить.Таким образом, вы должны подождать, пока синтезатор закончит говорить, прежде чем его освободят при выходе из вашего speak()
метода.