【问题标题】:Cannot get data from firebase to be appended to array in order无法从firebase获取数据以按顺序附加到数组
【发布时间】:2019-10-04 09:08:57
【问题描述】:

我正在尝试从我的 firebase 云存储中获取数据并将其按顺序放入一个数组中。我了解 firebase 的异步性质,并且我需要使用调度组来等待数据返回。我曾尝试在这里查看解决方案,但无法让我的代码正常工作。任何帮助将不胜感激

func ReadMyData() {
    let dispatchGroup = DispatchGroup()

    let data = Firestore.firestore().collection("users").document("LdGcPDsSVEtYyrGIHR1D")

        data.getDocument { (document, error) in

            for item in (document?.data())! {
                dispatchGroup.enter()
                self.Array.append(item.key)
                dispatchGroup.leave()
            }
            dispatchGroup.wait()
    }

    print(Array)

}

【问题讨论】:

  • 派组等待数据返回不一定准确。取决于您对数据的处理方式和时间。例如,如果要为 tableView 填充 dataSource 数组,可以在 Firestore 闭包中加载 dataSouce,然后调用 tableView.reloadData()。无需派送。问题是您希望它们按顺序排列。顺序是什么?按姓氏?通过uid?何时注册您的应用?
  • 请注意,由于 Firestore 的异步特性,print(Array) 将在加载数组之前执行,并且通常会打印 nil。在你的 for 循环之后移动它。此外,只需删除调度调用,因为它们不是必需的,并且您的数据将是有序的(您没有指定您希望数据如何排序)但是,依赖它们有序可能是一个问题。将它们放入字典中,顺序无关紧要。

标签: swift firebase google-cloud-firestore


【解决方案1】:

我建议您使用完成而不是 DispatchGroup。以后你会更多地使用它,所以你最好掌握它:

P.S:以驼峰式的方式命名您的函数名称和变量名称。这是 Swift 语言的规范。

func readMyData(completion: () -> ()) {

    let data = Firestore.firestore().collection("users").document("LdGcPDsSVEtYyrGIHR1D")

    data.getDocument { (document, error) in

        for item in (document?.data())! {
            self.myArray.append(item.key) //using Array as the name of an array is bad practice.
        }
        print(myArray)
        completion()
    }
}

当您调用此函数时,您将能够在调用完成时执行下一个操作,从而确保在执行下一个操作之前完成所有数据操作,在这种情况下,附加到您的数组。

【讨论】:

    【解决方案2】:

    抱歉,刚开始使用它。我发布了这个作为答案。由于与来自 firebase 的数据的异步调用混淆,我最初想要一个有序数组。但是,提供的解决方案以及在流浪中使用对象解决了我的问题。希望这是有道理的。感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多