在准备segue之前从闭包中提取数组 - Swift

时间:2017-10-08 12:40:24

标签: ios arrays swift closures

我通过闭包内的for循环构建数组,然后通过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的准备会带来距离和旅程时间,但是当我尝试访问它们时它们总是空的。

我认为我需要更新距离和journeyTimes数组,然后在关闭之外准备segue,但我不知道该怎么做。

感谢您对此的任何帮助

由于

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是使用Dispatch Group。创建一个新常量:

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)        
     }
}