我正在使用countySites
循环中calculate()
类的MKDirections
方法来请求从当前位置到数组for
中的露营地位置的距离计算。当我有一个长度为47个露营地的数组时,仅计算了一些露营地距离,其余的会产生一条错误消息,提示正在提出太多请求。在calculate()
循环中发出请求之前,我不知道如何检查for
是否不太忙。
我尝试在代码中放置一个while
循环,以反复检查是否仍使用isCalculating
Bool
属性来处理计算,但是它无法停止错误消息。
countySites = england.counties[selectedCounty!]!
let sourcePlacemark = MKPlacemark(coordinate: currentCoordinate!)
let request = MKDirections.Request()
request.source = MKMapItem(placemark: sourcePlacemark)
request.transportType = .automobile
request.requestsAlternateRoutes = false
let group = DispatchGroup()
activityIndicator.startAnimating()
// Step through sites one by one
for siteIndex in 0..<countySites.count {
var selectedSite = countySites[siteIndex]
let destinationPlacemark = MKPlacemark(coordinate: selectedSite.locationCoordinate)
request.destination = MKMapItem(placemark: destinationPlacemark)
let distanceAndDirections = MKDirections(request: request)
if currentCoordinate != nil {
group.enter()
distanceAndDirections.calculate { (response, error) in
if error == nil {
let distanceInMetres = response?.routes.first?.distance
let distanceInMiles = distanceInMetres! / 1610
let roundedDistanceInMiles = Int(distanceInMiles.rounded())
let distanceToSite = roundedDistanceInMiles
selectedSite.distance = distanceToSite
self.countySites[siteIndex] = selectedSite
} else {
print(error.debugDescription)
}
group.leave()
}
}
}
group.notify(queue: .main) {
self.countySites = self.sortByDistance(sites: self.countySites)
self.tableView.reloadData()
self.activityIndicator.stopAnimating()
}
}
}
答案 0 :(得分:0)
解决此问题的唯一方法是保留一个MKRoute数组,每当遇到新路径时,只需保存到该数组中并使用同一数组绘制路径即可。使用此方法,您可以保存mapKit距离通话
检查以下对我有用的代码段
var distanceArray: [MKRoute]? // like this create an array inside the class
func drawPath(destination: CLLocationCoordinate2D, source: CLLocationCoordinate2D) {
let sourcePlacemark = MKPlacemark(coordinate: source, addressDictionary: nil)
let destinationPlacemark = MKPlacemark(coordinate: destination, addressDictionary: nil)
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
let directionRequest = MKDirectionsRequest()
directionRequest.source = sourceMapItem
directionRequest.destination = destinationMapItem
directionRequest.transportType = .walking
let directions = MKDirections(request: directionRequest)
if distanceArray.count > 0 {
guard let route = distanceArray.first?.routes else {return}
self.showPath(route: route)
} else {
directions.calculate { (response, error) -> Void in
guard let response = response else {
if let error = error {
print("Error YuluMapView: \(error)")
}
return
}
guard let route = response.routes.first else {return}
distanceArray.append(route)
self.showPath(route: route)
}
}
}
func showPath(route: MKRoute) {
self.add((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.setVisibleMapRect(rect, edgePadding: defaultEdgeInsets, animated: true)
}
它为我工作了100%,希望您可以使用此逻辑来避免此问题。