【问题标题】:How to join multiple observeSingleEvent() calls results and perform action when all calls are complete?如何在所有调用完成后加入多个 observeSingleEvent() 调用结果并执行操作?
【发布时间】:2017-06-19 01:11:20
【问题描述】:

在一个 iOS 应用中,我们在一个循环中多次调用 observeSingleEvent() 来填充一个列表:

for i in 1...10 {
  ref.child("\(i)").observeSingleEvent(of: .value, with: { (snapshot) in
    // Add another value to the list
    let value = snapshot.value as? NSDictionary
    list.append(value)

    // All values are in the list
    if list.count == 10 {
      reloadView()
    }
  })
}

我们希望这 10 个调用或多或少同时处理,并且在所有调用完成后打算执行某个操作(例如在视图中显示列表)。

我们计算列表中的元素以确定所有调用何时完成,但我们正在寻找一种更有效/更优雅的方式来完成同样的事情。 Swift 中是否有更好的方法或 Firebase 推荐的更好方法?

【问题讨论】:

  • 这对我来说似乎是一个合理的方法。您可以跟踪仍待处理的项目的确切 ID,但我在这里看不到任何好处。
  • 您可以一次获取所有 10 个项目,有一些方法可以获取从 childId 开始的 n 元素。可能在您的情况下,您可以从子 1 开始获取 10 个项目。你能详细说明你想要达到的目标吗?
  • 你考虑过递归方法吗?

标签: ios swift firebase swift3 firebase-realtime-database


【解决方案1】:

如果你需要一个接一个地专门调用,你可以试试递归函数。

func observeSingleEventOfValue(with children: [String]) {

    var children = children.count > 0 ? children : nil

    guard let path = children?.removeFirst() else { return }

    ref.child(path).observeSingleEvent(of: .value, with: { (snapshot) in

        let value = snapshot.value as? NSDictionary

        self.list.append(value)

        if children!.count > 0 {
            self.observeSingleEventOfValue(with: children!)
        } else {
            self.reloadView()
        }
    })
}

然后您将使用一组子路径调用该方法。

observeSingleEventOfValue(with: Array(1...10).map { "\($0)" })

以递归方式执行此操作将确保按顺序观察孩子 - 一个接一个。

【讨论】:

  • 不,我们需要并行处理请求,否则接收所有请求的响应需要更长的时间。 10 仅用于说明目的,在我们的应用程序中,这个数字实际上是不同的,它可能会变得更大。我们只是在寻找一种在所有请求的工作完成后“加入线程”的好方法。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多