Запросы на геокодирование CLGeocoder превышают лимит

Я пытаюсь найти способы ограничить количество запросов, которые я отправляю к CLGeocoder, потому что я продолжаю превышать максимальный лимит. Я получаю "Error Domain=kCLErrorDomain Code = 2 "(null)". По сути, каждый раз, когда кто-то перемещает карту в области funcDidChangeAnimated, я получаю координаты, на которых они остановились, геокод, чтобы получить город /state, а затем нажмите на мой API, а затем используйте эти результаты для геокодирования новых точек карты в этом регионе. Есть ли у кого-нибудь передовой опыт для решения таких ситуаций? Любая помощь приветствуется.

Функция для проверки того, изменил ли пользователь регион карты:

private func mapViewRegionDidChangeFromUserInteraction() -> Bool {
let view: UIView = self.mapView.subviews[0] as UIView
//  Look through gesture recognizers to determine whether this region change is from user interaction
if let gestureRecognizers = view.gestureRecognizers {
    for recognizer in gestureRecognizers {
        if( recognizer.state == UIGestureRecognizerState.Began || recognizer.state == UIGestureRecognizerState.Ended ) {
            return true
        }
    }
 }
  return false
}

func mapView(mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
mapChangedFromUserInteraction = mapViewRegionDidChangeFromUserInteraction()
if (mapChangedFromUserInteraction) {
    // user changed map region

   }
}

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
if (mapChangedFromUserInteraction) {
    // user changed map region
    let center = mapView.centerCoordinate

    let mapLatitude = center.latitude
    let mapLongitude = center.longitude


     let locationmove = CLLocation(latitude: mapLatitude, longitude: mapLongitude)
    CLGeocoder().reverseGeocodeLocation(locationmove) { (placemarks, error) in

        if (error != nil){

            print(error)

        }else {

            if let p = placemarks?[0]{

                let locality = p.locality ?? ""
                let administrativeArea = p.administrativeArea ?? ""


                 self.mappedCity = String(locality)
                 self.mappedState = String(administrativeArea)
                 self.parseJSON("\(locality)", state: "\(administrativeArea)")
            }

        } 

     }
   }
  }

Функция для анализа JSON из результатов геокодирования:

func parseJSON(city: String, state: String){
let passedCity = city
let passedState = state
let escapedCity = passedCity.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
let escapedState = passedState.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

let url = NSURL(string:"http://www.API.com/api.php?city=\(escapedCity)&stateAbv=\(escapedState)&limit=10”)!

let session = NSURLSession.sharedSession()

let task = session.dataTaskWithURL(url) { (items, response, error) -> Void in

    if error != nil {

        print(error)


    }else {


        if let items = items {


            do {
                let jsonResult = try NSJSONSerialization.JSONObjectWithData(items, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

                if jsonResult.count > 0 {

                    if let datas = jsonResult["data"] as? NSArray{

                        for data in datas{

                            if let title = data["title"] as? String {

                                if let street = data["street"] as? String {

                                    if let city =  data["city"] as? String {

                                        if let stateAbv =  data["stateAbv"] as? String {

                                            if let zip =  data["zip"] as? String {

                                                self.geoAddress("\(title)", street: "\(street)", city: "\(city)", state: "\(stateAbv)", zip: "\(zip)")


                                            }
                                        }
                                    }

                                }

                            }

                        }
                    }

                }
            } catch{}


        }


    }

 }

 task.resume()

}


func geoAddress(title: String, street: String, city: String, state: String, zip: String){
let storeName = "\(title)"
let location = "\(street) \(city) \(state) \(zip)"
let geocoder = CLGeocoder();
geocoder.geocodeAddressString(location, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in
    if (error != nil) {
        print("Error \(error!)")
    } else if let placemark = placemarks?[0] {

        let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate

        let pointAnnotation:MKPointAnnotation = MKPointAnnotation()
        pointAnnotation.coordinate = coordinates
        pointAnnotation.title = storeName
        pointAnnotation.subtitle = location

        self.mapView.addAnnotation(pointAnnotation)

     }
  })
}

person kelsheikh    schedule 25.04.2016    source источник


Ответы (1)


Просто сравните обновленное местоположение со старым, поэтому расстояние, которое вы получите, должно быть достаточно большим, чтобы сделать еще один запрос CLGeocoder. В документации Apple говорится, что

  • Если вы хотите автоматически обновлять текущее местоположение пользователя (например, когда пользователь перемещается), отправляйте новые запросы геокодирования только тогда, когда пользователь переместился на значительное расстояние и по прошествии разумного времени. Например, в типичной ситуации не следует отправлять более одного запроса на геокодирование в минуту.

    Просмотрите официальную документацию CLGeocoder для получения дополнительной информации.

person Roohul    schedule 13.07.2016