Swift 将数据从Firestore存储到列表
我有一个数据库,存储一系列由用户每天输入的整数值,并存储为整数列表。我有以下代码查询数据库,并将搜索到的症状值存储到一个列表中,然后从函数中返回,同时执行for循环returnedData似乎包含数据库中的所有值,但是当我放置Swift 将数据从Firestore存储到列表,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,我有一个数据库,存储一系列由用户每天输入的整数值,并存储为整数列表。我有以下代码查询数据库,并将搜索到的症状值存储到一个列表中,然后从函数中返回,同时执行for循环returnedData似乎包含数据库中的所有值,但是当我放置print(returnedData)时在查询之后和返回语句之前,它会打印一个空列表。我不太清楚为什么for循环没有正确地附加到returnedData列表 func yearDataReturn(year: Int,symptom: String)->[Int]{
print(returnedData)时
在查询之后和返回语句之前,它会打印一个空列表。我不太清楚为什么for循环没有正确地附加到returnedData列表
func yearDataReturn(year: Int,symptom: String)->[Int]{
//fetches all the year for the month and returns it as a list
let collectionRef = db.collection("entries")
var returnedData:[Int] = []
collectionRef.whereField("year", isEqualTo: year).whereField("UserID", isEqualTo: UserDefaults.standard.integer(forKey: "UserID")).order(by: "monthOfYear").order(by: "weekOfMonth").order(by: "dayOfMonth")
.getDocuments{(QuerySnapshot,err)in
for doc in QuerySnapshot!.documents{
let sympLis=doc.get("SymptomValues") as! [Int]
let symp=sympLis[self.symptoms.firstIndex(of: symptom)!]
returnedData.append(symp)
}
}
return returnedData
}
首先欢迎来到这个网站
这是一个异步调用,这意味着查询行的(
collectionRef.whereField(…
)块将在returnedData
行之后执行
请检查此媒体文章->
您可以通过如下方式向函数传递一个
闭包来完成此操作->
func yearDataReturn(年份:Int,症状:String,完成:@escaping([Int]->Void)){
//获取该月的所有年份,并将其作为列表返回
让collectionRef=db.collection(“条目”)
var returnedData:[Int]=[]
collectionRef.whereField(“年”,isEqualTo:year)。whereField(“用户ID”,isEqualTo:UserDefaults.standard.integer(forKey:“用户ID”)))。订单(收件人:“monthOfYear”)。订单(收件人:“weekOfMonth”)。订单(收件人:“dayOfMonth”)
.getDocuments{(QuerySnapshot,err)位于
用于QuerySnapshot!文档中的文档{
让sympLis=doc.get(“症状值”)为![Int]
让症状=症状[自我症状.第一个索引(症状)!]
returnedData.append(symp)
}
完成(返回数据)
}
}
用法
yearDataReturn(年份:5,症状:“asdf”){中的症状值
打印(值)
}
首先欢迎来到这个网站
这是一个异步调用,这意味着查询行的(collectionRef.whereField(…
)块将在returnedData
行之后执行
请检查此媒体文章->
您可以通过如下方式向函数传递一个闭包来完成此操作->
func yearDataReturn(年份:Int,症状:String,完成:@escaping([Int]->Void)){
//获取该月的所有年份,并将其作为列表返回
让collectionRef=db.collection(“条目”)
var returnedData:[Int]=[]
collectionRef.whereField(“年”,isEqualTo:year)。whereField(“用户ID”,isEqualTo:UserDefaults.standard.integer(forKey:“用户ID”)))。订单(收件人:“monthOfYear”)。订单(收件人:“weekOfMonth”)。订单(收件人:“dayOfMonth”)
.getDocuments{(QuerySnapshot,err)位于
用于QuerySnapshot!文档中的文档{
让sympLis=doc.get(“症状值”)为![Int]
让症状=症状[自我症状.第一个索引(症状)!]
returnedData.append(symp)
}
完成(返回数据)
}
}
用法
yearDataReturn(年份:5,症状:“asdf”){中的症状值
打印(值)
}
不要忘记标记完成@escaping
,因为返回值可以逃避关闭。感谢@bsod的提醒,请检查我编辑的答案。还有一篇关于@escaping
和@nonescaping
关闭的文章。我想分享这篇文章是因为其他人的好处-->>不要忘记删除k完成@escaping
,因为返回值可以逃避闭包。感谢@bsod的提醒,请检查我编辑的答案。还有一篇关于@escaping
和@nonescaping
闭包的文章。我想分享这篇文章,因为其他人的好处-->>你的函数会立即返回数组在查询数据库中的值之后。对getDocuments
的调用是异步的,这意味着您当前所在的线程在继续之前不会等待方法返回。您必须等待getDocuments
返回数据,然后才能解析数据并将其传递出去。也就是说,请查看转义闭包要处理此用例,不是标准的返回函数。您的函数在查询数据库中的值后立即返回数组。对getDocuments
的调用是异步的,这意味着您当前所在的线程在继续之前不会等待方法返回。您必须等待getDocuments
返回数据,然后才能解析数据并将其传递出去。也就是说,查看转义闭包来处理此用例,而不是标准的返回函数。