从 Firestore 文档中获取数据并附加到数组

Posted

技术标签:

【中文标题】从 Firestore 文档中获取数据并附加到数组【英文标题】:Get data from Firestore document and append to array 【发布时间】:2020-05-25 06:47:53 【问题描述】:

这里是firestore,里面有一个由ingID组成的成分集合,每个ingID有4个字段

image of my firestores

我有 [String] 的 ingID 像这样:["ing1", "ing2", ...] 调用 byDeptIngredientID 我想获取每个 ingID 的 departmentEN 所以我在 viewController 中有这段代码:

for id in byDeptIngredientID 
    print("start-function")
    GroceryAPI().getIngredientDept(ingID: id)
    print("finish-function")

然后我在另一个文件调用 GroceryAPI 中有这段代码。这就是我获得 departmentEN 字段的方式:

func getIngredientDept(ingID: String) 
     var byDeptIngredientDept = [String]()
     let ingredientList = Firestore.firestore().collection("ingredients").document(ingID)

     ingredientList.getDocument  (document, err) in
        print("appending...")
        self.deptIngredient.append(document!.get("departmentEN") as! String)
     
     print("deptIngredient => \(self.deptIngredient)")

如您所见,我将 departmentEN 附加到 deptIngredient 中,但是当我之后打印出来时,结果只是空 [ ]。结果如下:

start-function
deptIngredient => []
finish-function
appending...
appending...
appending...

所以它只是跳过 getDocument 做其他事情然后回来做最后?可能是某种异步问题?但我希望 deptIngredient 像 ["dept1", "dept2", ...] 以供进一步使用。

知道如何解决这个问题吗?提前谢谢你。

PS。我已经尝试了 DispatchGroup 和 DispatchQueue,但没有运气。

【问题讨论】:

【参考方案1】:

请试试下面的代码

let docRef = Firestore.firestore().collection("ingredients").document(ingID)

docRef.getDocument  (document, error) in
    if let document = document, document.exists 
       let data = document.data()
       let dataDescription = data.map(String.init(describing:)) ?? "nil"
       print("Document data: \(dataDescription)")

       let ingredient = data["departmentEN"] as? String ?? ""
       self.deptIngredient.append(ingredient)

     else 
        print("Document does not exist")
    

【讨论】:

还是一样的结果,比如:enter for id loop --> finish for id loop --> 文档数据:..... 将 byDeptIngredientDept 变量移到 func getIngredientDept 之外。

以上是关于从 Firestore 文档中获取数据并附加到数组的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 从文档的内部数组中获取数据

如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]

从 id 数组中获取 firestore 文档列表

Firestore 将具有服务器时间戳的对象附加到数组(字段类型)

Firestore onSnapshot 通过 onEffect 中的状态附加到数组

无法从 Firestore 集合中读取