【问题标题】:Assigning Firebase Firestore document value to swift variable [duplicate]将 Firebase Firestore 文档值分配给 swift 变量 [重复]
【发布时间】:2020-07-08 20:09:02
【问题描述】:

所以我试图从 Firebase Firestore 获取数据并将其放入我的函数内的局部变量中。在函数内部,我为名称创建了一个变量,该变量应该包含从 Firebase 获取的用户名称的值。问题在于,赋予 nameData 值(来自数据库的名称)的变量名称实际上从未发生过变异。我应该如何从数据库中获取名称并将其放入变量中?

public func fetchName(email: String) -> String {
        var name: String = "FIRST VALUE"
        
        database.collection(workerCollection).document(email).getDocument() {(querySnapshot, error) in
            if let error = error {
                print("Error getting documents: \(error)")
            } else {
                //get info about user
                if (querySnapshot != nil && querySnapshot!.exists){
                    let documentData = querySnapshot!.data()!
                    if let nameData = (documentData["Name"] as! String?){
                        name = nameData
                    }
                    print(name)
                }
            }
        }
        
    return name
}

【问题讨论】:

  • getDocument() 是异步的,在查询完成之前立即返回。
  • 现在返回的名称是什么?函数是否返回FIRST VALUE

标签: swift firebase google-cloud-firestore


【解决方案1】:

在您的函数中添加一个完成处理程序以获取名称。像这样修改你的函数!

public func fetchName(email: String, Completion:@escaping((String)->()) {
    
    database.collection(workerCollection).document(email).getDocument() {(querySnapshot, error) in
        if let error = error {
            print("Error getting documents: \(error)")
        } else {
            //get info about user
            if (querySnapshot != nil && querySnapshot!.exists){
                let documentData = querySnapshot!.data()!
                if let nameData = (documentData["Name"] as! String?){
                    Completion(nameData)
                }
            }
        }
     }
  }

然后在 viewDidLoad 或任何你喜欢的地方调用该函数。

fetchName(email: "a@b.com") { (name) in
        print(name)
    }

【讨论】:

    【解决方案2】:

    试试这个:

    public func fetchName(email: String) -> String? {
            var name: String?
            
            name = database.collection(workerCollection).whereField("emailField", isEqualTo: email)
    
            dispatchQueue.main.async {
                return name
            }
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多