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)
。 (您仍然可以使用计数器来确定所有请求何时完成。)
这样,每个用户都会有一个与之关联的持续时间,您可以通过按所需顺序循环访问用户来相应地显示它们。
我正在制作一个应用程序,当您单击一个按钮时,它会在一个表格视图中填充所有用户及其估计的预计到达时间。当我循环遍历我的用户并获取他们的位置时,我一直 运行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)
。 (您仍然可以使用计数器来确定所有请求何时完成。)
这样,每个用户都会有一个与之关联的持续时间,您可以通过按所需顺序循环访问用户来相应地显示它们。