微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Firebase数据库值转换为变量Swift

如何解决将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)")

解决方法

  1. 尝试在函数中打印languageResult-也许您没有在函数中获取它并且未分配变量
  2. 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 举报,一经查实,本站将立刻删除。