Как я могу остановить метод "вычисления" класса "MKDirections" от выполнения слишком большого количества запросов для расчета расстояния?

Я делаю запросы для расчета расстояния от моего текущего местоположения до местоположений места разбивки лагеря в массиве countySites с использованием calculate() метод MKDirections класс в for петля. Когда у меня есть массив длиной 47 мест для кемпинга, рассчитываются только некоторые расстояния для кемпинга, остальные выдают сообщение об ошибке, указывающее на слишком большое количество запросов. Я не знаю, как проверить, что calculate() не слишком занят, прежде чем я сделаю запрос в for петля.

Я пытался разместить while цикл в коде, чтобы многократно проверять вычисления, которые все еще обрабатываются с использованием isCalculatingBool свойство, но оно не может остановить сообщения об ошибках.

            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%, и надеюсь, вы сможете использовать эту логику, чтобы избежать этой проблемы.

Другие вопросы по тегам