我正在检查用户是否接受了语音识别。但是由于某种原因,状态是.authorized,但是相应的变量不会被更改。我在这里错过了什么?它不是要向用户显示消息,而只是为了一些处理用例的错误。
class ViewModel: ObservableObject {
@Published var requestAuth: Bool = false
init() {
SFSpeechRecognizer.requestAuthorization { (authState) in
DispatchQueue.main.async {
if authState == .authorized {
print("is authorized") // <---- is printed!
self.requestAuth = true
} else {
self.requestAuth = false
}
}
}
if self.requestAuth { // <--- will not be executed - why?
// do something...
}
}发布于 2021-03-13 20:08:09
requestAuthorization大括号({})中的代码称为callback函数。通常情况下,回调函数不会立即执行。事实上,该功能的文档声明:
此方法异步执行,在调用它后不久返回。
这意味着下面的代码不会立即发生。类似地,您在回调函数中使用DispatchQueue.main.async,该函数的作用也是相同的。大括号中的代码不会马上被调用,所以您不能在以后的结构中基于已经发生的任何事情。
这方面的解决方案是调用任何您需要的函数,这些函数基于这些闭包内部的授权状态--就像您拥有print("is authorized")的地方一样。
init() {
SFSpeechRecognizer.requestAuthorization { (authState) in
DispatchQueue.main.async {
if authState == .authorized {
print("is authorized") // <---- is printed!
self.requestAuth = true
// do other things based on authorization status
} else {
self.requestAuth = false
}
}
}
//can't rely on having an updated value for self.requestAuth here
}https://stackoverflow.com/questions/66617683
复制相似问题