【问题标题】:How do I save data from cloud firestore to a variable in swift?如何将数据从云火库快速保存到变量中?
【发布时间】:2020-07-23 19:45:59
【问题描述】:

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

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块中的代码才会被执行(什么?已经返回的函数中的代码如何继续执行?)。

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

【问题讨论】:

    标签: swift firebase google-cloud-firestore


    【解决方案1】:

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

    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 或任何其他类似的函数中调用函数。

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

    您可以查看更多关于Completion Handlershere的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多