小编典典

等到带有异步网络请求的 swift for 循环完成执行

all

我想要一个 for in 循环将一堆网络请求发送到 firebase,然后在方法完成执行后将数据传递给新的视图控制器。这是我的代码:

var datesArray = [String: AnyObject]()

for key in locationsArray {       
    let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
    ref.observeSingleEventOfType(.Value, withBlock: { snapshot in

        datesArray["\(key.0)"] = snapshot.value
    })
}
// Segue to new view controller here and pass datesArray once it is complete

我有几个担忧。首先,我如何等到 for 循环完成并且所有网络请求都完成?我无法修改 observeSingleEventOfType 函数,它是
firebase SDK 的一部分。另外,我是否会通过尝试从 for 循环的不同迭代中访问 datesArray
来创建某种竞争条件(希望这是有道理的)?我一直在阅读有关 GCD 和 NSOperation 的信息,但我有点迷茫,因为这是我构建的第一个应用程序。

注意: Locations 数组是一个包含我需要在 firebase 中访问的键的数组。此外,异步触发网络请求也很重要。我只想等到所有异步请求完成后再将
datesArray 传递给下一个视图控制器。


阅读 159

收藏
2022-07-06

共1个答案

小编典典

当所有请求完成时,您可以使用调度组触发异步回调。

这是一个使用调度组在多个网络请求全部完成时异步执行回调的示例。

override func viewDidLoad() {
    super.viewDidLoad()

    let myGroup = DispatchGroup()

    for i in 0 ..< 5 {
        myGroup.enter()

        Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON { response in
            print("Finished request \(i)")
            myGroup.leave()
        }
    }

    myGroup.notify(queue: .main) {
        print("Finished all requests.")
    }
}

输出

Finished request 1
Finished request 0
Finished request 2
Finished request 3
Finished request 4
Finished all requests.
2022-07-06