Asynchronous 在Swift中异步发出未知数量的URL请求

Asynchronous 在Swift中异步发出未知数量的URL请求,asynchronous,recursion,swift2,closures,tree-traversal,Asynchronous,Recursion,Swift2,Closures,Tree Traversal,我需要通过发出异步URL请求来遍历节点数未知的树。我目前的做法如下: class Parent { var foo: String var id: Int var children: [Child]? func loadChildren() { for child in self.children { self.getAllChildren(child) } } func getAl

我需要通过发出异步URL请求来遍历节点数未知的树。我目前的做法如下:

class Parent {

    var foo: String
    var id: Int
    var children: [Child]?

    func loadChildren() {

        for child in self.children {
            self.getAllChildren(child)
        }

    }

    func getAllChildren(current: Child) {
        current.load() {(success) in
            if (success) {
                if let children = current.children {
                    for child in children {

                        self.getAllChildren(child)

                    }
                }
            }
        }
    }
}

class Child {

    var bar: String
    var id: Int
    var children: [Child]?

    func load(success: (Bool) -> ()) {

        // Load from API and initalize values

    }

}
func loadChildren(success: (Bool) -> ()) {
 // do stuff
}
我目前上述方法的问题是,我不知道加载何时完成。我不在乎是否有一些孩子加载失败,但我需要在父母的所有孩子(以及他们的孩子)加载完毕后进行UI更新

我研究过各种各样的方法,比如承诺和派遣小组,但我正在努力让它发挥作用。我使用的是Swift 2,理想情况下,父级将具有如下功能:

class Parent {

    var foo: String
    var id: Int
    var children: [Child]?

    func loadChildren() {

        for child in self.children {
            self.getAllChildren(child)
        }

    }

    func getAllChildren(current: Child) {
        current.load() {(success) in
            if (success) {
                if let children = current.children {
                    for child in children {

                        self.getAllChildren(child)

                    }
                }
            }
        }
    }
}

class Child {

    var bar: String
    var id: Int
    var children: [Child]?

    func load(success: (Bool) -> ()) {

        // Load from API and initalize values

    }

}
func loadChildren(success: (Bool) -> ()) {
 // do stuff
}