我正在通过闭包内的 for in 循环构建数组,然后通过 segue 传递这些数组。我能够从闭包内部打印数组的内容,但是当我从外部访问数组时,它总是空的。
我尝试使用 .reloadData() 更新闭包之外的数组,但我似乎不能完全正确。有谁知道这是否是正确的方法?
这是我的代码:
var distances: [Double]
var journeyTimes: [Double]
directions.calculate { response, error in
if let route = response?.routes.first {
print("Distance: (route.distance/1000) km, ETA: (route.expectedTravelTime/60) mins")
self.distances.append(route.distance/1000)
self.journeyTimes.append(route.expectedTravelTime/60)
print(self.distances)
print(self.journeyTimes)
} else {
print("Error!")
} updateArrays()
}
func updateArrays() {
self.collectionView.reloadData()
}
上面的打印语句会产生结果,我的 segue 准备携带距离和旅程时间,但当我尝试访问它们时,它们总是空的。
我想我需要在准备 segue 之前更新距离和旅程时间数组,在闭包之外,但我不知道该怎么做。
感谢您对此的任何帮助
谢谢
解决此问题的一种方法是使用调度组。 创建一个新常量:
let myDispatchGroup = DispatchGroup()
var distances: [Double]
var journeyTimes: [Double]
在进行网络呼叫之前,请添加:
myDispatchGroup.enter()
请确保在异步网络调用开始之前添加它。
在阵列完全更新并且即将退出异步网络调用后,添加:
self.myDispatchGroup.leave()
只有在 myDispatchGroup 上的进入和离开次数相等后,才会调用此函数。 在执行 segue 之前添加它
func yourFunctionThatCallsSegue() {
myDispatchGroup.notify(queue: DispatchQueue.main) {
let destinationViewController = segue.destination as! YourDestinationViewController
destinationViewController.distances = self.distances // you are in a dispatch group closure
destinationViewController.journeyTimes = self.journeyTimes
performSegue(withIdentifier: "Your Identifier", sender: AnyClass.self)
}
}