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

时间:2020-08-14 08:05:35

标签: swift database firebase var

我声明了一个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)")

2 个答案:

答案 0 :(得分:0)

  1. 尝试在函数中打印languageResult-也许您没有在函数中获取它并且未分配变量
  2. language变量设为公开

答案 1 :(得分:0)

我认为您在这里缺少代码的异步特性。 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)
    })
}
相关问题