如何解决将Firebase数据库值转换为变量Swift
我声明了一个var,可以从Firebase数据库检索值,但是当我在ViewDidLoad中打印var时,它是空的,我不明白这是怎么回事。谢谢大家 这是我在打印var时得到的答案:这是语言
//
var language: String = ""
//
func getUserLanguage(completion:((String) -> Void)?) {
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
ref.child("users").child(uid).observe(.value,with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let languageResult = value?["language"] as? String ?? ""
completion?(languageResult)
}
)}
//
getUserLanguage { (languageResult) in
self.language = languageResult
}
// I print the value in ViewDidload
print("this is the language\(self.language)")
解决方法
- 尝试在函数中打印
languageResult
-也许您没有在函数中获取它并且未分配变量 - 将
language
变量设为公开
我认为您在这里缺少代码的异步特性。 getUserLanguage
函数仅在从firebase的observe(.value,with: { (snapshot)
方法获得回调时才调用完成。它是异步的。在language
中调用getUserLanguage
之后,不会立即获得viewDidLoad
的值。
override func viewDidLoad() {
super.viewDidLoad()
getUserLanguage { (language) in
print(language) // --> prints the expected value
self.language = language
}
print(language) // --> prints ""
}
func getUserLanguage(completion: @escaping (String) -> Void) {
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
ref.child("users").child(uid).observe(.value,with: { (snapshot) in
let value = snapshot.value as? [String: Any]
let languageResult = value?["language"] as? String ?? ""
print("language: ",languageResult) // --> prints the expected value
completion(languageResult)
})
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。