问题描述
我想将文档中的特定字段保存到变量中.到目前为止我的代码:
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 保存到变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!