Как я могу остановить метод «вычисления» класса «MKDirections» от выполнения слишком большого количества запросов для расчета расстояния? - PullRequest
0 голосов
/ 22 апреля 2019

Я делаю запросы на расчет расстояния от моего текущего местоположения до местоположения места разбивки лагеря в массиве 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()

            }
        }

    }
...