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

标签 ios arrays swift closures

我通过闭包内的 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的准备携带了距离和旅程时间,但当我尝试访问它们时它们总是空的。

我认为我需要在准备关闭之前更新距离和旅程时间数组,但我不知道该怎么做。

感谢您对此提供的任何帮助

谢谢

最佳答案

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

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

关于ios - 在准备 segue 之前从闭包中提取数组 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46631199/

相关文章:

iOS:用户在通知提醒对话框中选择 "Cancel"然后手动启动应用程序后如何获取推送通知对象

ios - 子类 UIWebView 以附加每个链接(在 Swift 中)

arrays - 将日期和整数合并到 ARRAY 中

ios - 将表情符号编码为字符串

ios - Swift 3 - 推送新 View 但保持相同的 NavigationBar

ios - 为什么lazy property和didSet会以递归调用结束?

ios - 将 MKMoviePlayerController 的方向普遍锁定为仅横向模式

ios - 将您的自定义类命名为与 Swift/iOS 中的文件名相同的命名约定是否是一个好的命名约定

java - 骰子模拟并使用数组作为值

javascript - jQuery:如何比较每个索引中具有多个值的两个数组并删除重复项