首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SFSpeechRecognizer.requestAuthorization中设置变量

在SFSpeechRecognizer.requestAuthorization中设置变量
EN

Stack Overflow用户
提问于 2021-03-13 19:27:44
回答 1查看 66关注 0票数 0

我正在检查用户是否接受了语音识别。但是由于某种原因,状态是.authorized,但是相应的变量不会被更改。我在这里错过了什么?它不是要向用户显示消息,而只是为了一些处理用例的错误。

代码语言:javascript
复制
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...
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-13 20:08:09

requestAuthorization大括号({})中的代码称为callback函数。通常情况下,回调函数不会立即执行。事实上,该功能的文档声明:

此方法异步执行,在调用它后不久返回。

这意味着下面的代码不会立即发生。类似地,您在回调函数中使用DispatchQueue.main.async,该函数的作用也是相同的。大括号中的代码不会马上被调用,所以您不能在以后的结构中基于已经发生的任何事情。

这方面的解决方案是调用任何您需要的函数,这些函数基于这些闭包内部的授权状态--就像您拥有print("is authorized")的地方一样。

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66617683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档