将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)
    })
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...