Swift 将数据从Firestore存储到列表

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]{

我有一个数据库,存储一系列由用户每天输入的整数值,并存储为整数列表。我有以下代码查询数据库,并将搜索到的症状值存储到一个列表中,然后从函数中返回,同时执行for循环returnedData似乎包含数据库中的所有值,但是当我放置
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
返回数据,然后才能解析数据并将其传递出去。也就是说,查看转义闭包来处理此用例,而不是标准的返回函数。