Как я могу остановить метод "вычисления" класса "MKDirections" от выполнения слишком большого количества запросов для расчета расстояния?
Я делаю запросы для расчета расстояния от моего текущего местоположения до местоположений места разбивки лагеря в массиве 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 ответов
Единственное решение этой проблемы - просто сохранить массив 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%, и надеюсь, вы сможете использовать эту логику, чтобы избежать этой проблемы.