【问题标题】:Swift: Wait for firestore load before next loadSwift:在下一次加载之前等待firestore加载
【发布时间】:2018-08-01 17:32:06
【问题描述】:

我有一个视图控制器,它列出了 firestore 数据库中的数据。在 firestore 集合中,我有一堆文档,其中包含列表中显示的信息,还有一个名为 order 的文档,其中包含一个字段,该字段是我希望它们显示的顺序的字符串数组。我的代码抓住了这个:

self.db.collection("officers").document(school).collection(grade).document("order").getDocument {(document, error) in
   if let document = document, document.exists {
     self.officerNames = (document.data()!["order"] as! Array<String>)

然后应该使用数组order (officerNames) 中的字符串来查询同一集合中的文档(所有文档都有不同的role,因此它只会在快照中获取一个文档)并以与order (officerNames) 中的一组相同的顺序显示它们。

for item in 1...self.officerNames.count {
    self.db.collection("officers").document(school).collection(grade).whereField("role", isEqualTo: self.officerNames[item-1]).getDocuments() { (querySnapshot, err) in
       if let err = err {
          print("Error getting documents: \(err)")
       } else {
          for document in querySnapshot!.documents {
              let officerMessage = document.data()["agenda"] as! String
              let officerInfo = document.data()["short"] as! String
              (a bunch of code here using that ^ ^ and due to the color I need item to be an integer)
          }
       }
    }
}

我知道,如果我尝试在 self.collection("officers")..... 之前打印 item,数字会按 1 计数,但如果我在 for document in querySnapshot..... 中这样做,它们都会出现故障,这意味着某些文档的加载速度比其他文档快。我已经阅读了 Swift 中的异步函数(尽管我确实在 JavaScript 中使用了这些函数),但我真的很困惑如何使用它们,希望有一种更简单的方法可以做到这一点。在再次遍历循环之前,我可以等待以确保先前的文档已被加载和分析吗?

这是数据库的屏幕截图:

【问题讨论】:

    标签: swift firebase google-cloud-firestore


    【解决方案1】:

    老实说,您可能想检查您的数据结构,看看您是否可以创建一个不需要像这样的多个查询的数据结构。我不太清楚你的数据结构是什么,但如果你更新你的问题以包含它,我可以就如何重构提供一些建议,这样你就不必执行 2 个不同的get 请求。

    话虽如此,由于 Swift 没有像 JS 这样的 Promise,因此很难保持数据有序。在大多数情况下,闭包效果很好,正如我在 this blog 中所写的那样。但是它们仍然不会保留异步调用数组中的顺序。假设您使用某个数组来存储军官的数据,您可以通过给每个数组一个默认值来预先声明数组的大小。这看起来像这样:

    var officerArray = [Officer](repeating:Officer(), count: self.officerNames.count)
    

    当然,它会根据您填充的对象类型而有所不同。在这种情况下,我使用了一些通用的 Officer 对象。

    然后,与其将新创建的 Officer 对象(或您所称的任何对象)附加到数组的末尾,不如将其值添加到数组中的特定位置。

    for item in 1...self.officerNames.count {
        self.db.collection("officers").document(school).collection(grade).whereField("role", isEqualTo: self.officerNames[item-1]).getDocuments() { (querySnapshot, err) in
           if let err = err {
              print("Error getting documents: \(err)")
           } else {
              for document in querySnapshot!.documents {
                  let officerMessage = document.data()["agenda"] as! String
                  let officerInfo = document.data()["short"] as! String
                  // etc
                  officerArray[self.officerNames.count-1] = Officer(officerMessage: officerMessage, officerInfo: officerInfo) // or however you're instantiating your objects
              }
           }
        }
    }
    

    这会保留顺序。

    【讨论】:

    • 由于另一个正在使用该数据库的 Web 应用程序,此时我无法对数据结构进行太多更改。我将用我的数据库图片更新问题。理想情况下,我正在寻找一些东西来告诉 for 循环“等到这个加载......好吧,现在下一个”。
    • 我添加了图片。
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2019-10-28
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-01-28
    相关资源
    最近更新 更多