如何连接多个observeSingleEvent()调用结果并在所有调用完成后执行操作?

时间:2017-02-02 04:23:35

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

在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推荐的更好的方法呢?

1 个答案:

答案 0 :(得分:-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)" })

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