本文介绍了如何快速将数据从 Cloud Firestore 保存到变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将文档中的特定字段保存到变量中.到目前为止我的代码:

I want to save a particular field from a document into a variable. My code so far:

func getDocument(path: String, field: String? = "nil") -> some Any{
    var returnVar : Any = "DEFAULT VAL"
    var db: Firestore!
    db = Firestore.firestore()

    let docRef = db.document(path)
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            if(field != "nil"){
                let property =  document.get("phrase") ?? "nil"
                returnVar = property
                return;
            }
            else{
                let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
                returnVar = dataDescription
                return;
            }
        } else {
            print("Document does not exist")
            returnVar = -1
            return;
        }
    }
    print("Returned val: " + (returnVar as! String))
    return returnVar;
}

然而,似乎我的 getDocument 方法在从 firebase 读取数据之前返回(来自纯 OOP 领域,我不知道这是如何发生的)从调试中,似乎执行只是跳过整个 docRef.getDocument 代码和跳转到 return 语句.docRef.getDocument 块中的代码只有在函数返回后才会被执行(什么?已经返回的函数中的代码如何继续执行?).

It seems however that my getDocument method returns before ever reading the data from firebase(coming from pure OOP land, I have no clue how this even happens) From debugging, it seems execution simply skips over the entire docRef.getDocument code and jumps to the return statement. It is only after the function returns does the code in the docRef.getDocument block get executed(what? how does code in a function that has already returned continue to execute?).

如何将特定字段存储在变量中并返回?

How can I store a particular field in a variable and return it?

推荐答案

那是因为 Firestore 函数 getDocument 是一个 asynchronous 函数,它立即返回,然后继续执行执行里面的代码.如果你想从这里返回一个特定的值,你需要使用 completion Handler.您的函数可能如下所示.

That's because Firestore function getDocument is an asynchronous function and it returns immediately and after that it continues to execute the code inside it. If you want to return a particular value from here, you need to use completion Handler. Your function may look like this.

func getDocument(path: String, field: String? = "nil", completion:@escaping(Any)->()) {
var returnVar : Any = "DEFAULT VAL"
var db: Firestore!
db = Firestore.firestore()

let docRef = db.document(path)
docRef.getDocument { (document, error) in
    if let document = document, document.exists {
        if(field != "nil"){
            let property =  document.get("phrase") ?? "nil"
            returnVar = property
            completion(returnVar)
        }
        else{
            let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
            returnVar = dataDescription
            completion(returnVar)
        }
    } else {
        print("Document does not exist")
        returnVar = -1
        completion(returnVar)
      }
    }
  }

然后在 viewDidLoad 或任何其他类似的函数中调用该函数.

Then call the function in viewDidLoad or in any other function like this.

getDocument(path: path, field: field){(value) in
    print(value)
}

您可以在此处查看有关完成处理程序的更多信息

You can checkout more about Completion Handlers here

这篇关于如何快速将数据从 Cloud Firestore 保存到变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-30 08:38