Apple Mapkit calculateETAWithCompletionHandler 遍历数组

Apple Mapkit calculateETAWithCompletionHandler loop through array

我正在制作一个应用程序,当您单击一个按钮时,它会在一个表格视图中填充所有用户及其估计的预计到达时间。当我循环遍历我的用户并获取他们的位置时,我一直 运行ning 遇到一个问题,它不会按照循环遍历的相同顺序生成数组,因此时间变得混乱。我已经尝试了几种不同的循环方式,但似乎当它到达 directions.calculateETA 部分时它被延迟并且 运行s 在不同的时间。任何人都可以帮助我 运行 有效地解决这个问题,这样循环就不会 运行 出错吗?

for user in usersArray {

    var userLocations:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: user["location"].latitude, longitude: user["location"].longitude)

    ETARequest(userLocations)

}

func ETARequest(destination:CLLocationCoordinate2D) {

    let request = MKDirectionsRequest()

    if let currentLocation = self.manager.location?.coordinate {

        request.source =  MKMapItem(placemark: MKPlacemark(coordinate: currentLocation, addressDictionary: nil))

        request.destination = MKMapItem(placemark: MKPlacemark(coordinate: destination, addressDictionary: nil))

        request.transportType = .Automobile

        let directions = MKDirections(request: request)

        directions.calculateETAWithCompletionHandler({ ( response, error) in

            if error == nil {

                if let interval = response?.expectedTravelTime  {

                    print(self.formatTimeInterval(interval))

                    self.durationArray.insert(self.formatTimeInterval(interval), atIndex: 0)

                    if self.durationArray.count == self.allUsers.count {

                        print(self.durationArray)

                        self.tableView.reloadData()

                    }

                }

            } else {

                print("Error Occurred")
            }

        })

    }
}

这里的问题是 calculateETAWithCompletionHandler 发出了网络请求。它是一个异步函数,因此您不能假设您对它的所有调用都会 return 按照您发送它们的相同顺序。这是此问题的一种解决方案:

如果您有一个带有可选 duration 属性 的 user 对象,您可以重构您的 ETARequest 方法以将一个作为输入:

func ETARequest(destination:CLLocationCoordinate2D, user: UserType) {
    //Do stuff...
}

然后,在传递给 calculateETAWithCompletionHandler 的完成处理程序块中,您可以将 self.durationArray.insert(self.formatTimeInterval(interval), atIndex: 0) 替换为 user.duration = self.formatTimeInterval(interval)。 (您仍然可以使用计数器来确定所有请求何时完成。)

这样,每个用户都会有一个与之关联的持续时间,您可以通过按所需顺序循环访问用户来相应地显示它们。