【问题标题】:Firebase function to return document result inside swift funcFirebase 函数在 swift func 中返回文档结果
【发布时间】:2020-04-07 15:59:42
【问题描述】:

我编写了一个函数来从 Firebase Firestore 获取特定文档。这是我的代码:

func getDocumentFromFirebase(collection: String, documentId: String) -> [String: String] {

    var firebaseResult = [String: String]()
    let docRef = db.collection(collection).document(documentId)

    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            var property = document.get("name") as! String
            //print("Document data string: \(property)")
            firebaseResult["name"] = property

            return firebaseResult
        } else {
            print("Document does not exist")
        }
    }
}

如您所见,我想在字典中返回结果,但返回行出现错误:

“void 函数中出现意外的非 void 返回值。”

但是当我将它向下移动几行时,在 Firebase 调用完成之前返回并且字典为空。

我知道我正在尝试在字典中返回结果,在 Void 函数中从 Firebase 获取文档。

我的问题是,检索到文档后如何在 Dictionary 中返回 Firebase 调用的结果?

谢谢!

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    你需要一个完成,因为你不能在 fireStore 闭包中返回值

    func getDocumentFromFirebase(collection: String, documentId: String,completion:@escaping(([String: String]?) -> ()))   { 
        var firebaseResult = [String: String]()
        let docRef = db.collection(collection).document(documentId) 
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                var property = document.get("name") as! String
                //print("Document data string: \(property)")
                firebaseResult["name"] = property 
                completion(firebaseResult)
            } else {
                print("Document does not exist")
                completion(nil)
            }
        }
    }
    

    打电话

    getDocumentFromFirebase(_,_) { res in 
    
    } 
    

    【讨论】:

    • 嘿,谢谢以上内容非常有帮助 - 如果您的完成只是一个字符串,一旦您返回,是否可以将其存储为变量?还是只能在调用的 { } 内打印?
    【解决方案2】:

    调用 getDocumentFromFirebase 的函数将有权访问在 completion(....) 中传递的内容

    上述答案详细信息中的“res”是作为参数传递给完成的内容,这将是firebase的结果,这是我实现的一个示例

    func getUser(userId: String, completion: @escaping((_ user: User?) -> ())) {
        let docRef = db.collection(Collection.users.rawValue).document(userId)
    
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                let returnedUser = try? document.data(as: User.self)
                completion(returnedUser)
            } else {
                print("user doesn't exist")
                completion(nil)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多