iphone - corelocation - core location swift 4
kCLErrorDomain error 2 después de geocodificar repetidamente con CLGeocoder (2)
Tengo una barra de búsqueda en mi aplicación en la que el usuario puede escribir una dirección y aparecerá el resultado geocodificado. El resultado se actualiza a medida que el usuario escribe, de acuerdo con el siguiente código:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
...
if (self.geocoder.geocoding) [self.geocoder cancelGeocode];
[self.geocoder geocodeAddressString:searchText completionHandler:^(NSArray *placemarks, NSError *error) {
if (error != nil) {
NSLog(@"ERROR during geocode: %@", error.description);
return;
}
//update the view
}];
}
Esto funciona para los primeros caracteres que el usuario ingresa en el campo de búsqueda. Sin embargo, después de que el usuario escribe más caracteres repetidamente, el geocodificador comienza a dar el siguiente error (que sé que significa que hubo un problema con la red):
ERROR during geocode: Error Domain=kCLErrorDomain Code=2 "The operation couldn’t be completed. (kCLErrorDomain error 2.)"
El geocodificador no vuelve a funcionar hasta que se vuelve a cargar el ViewController completo. ¿Por qué podría estar sucediendo esto y qué puedo hacer para resolverlo?
Creo que la razón es la siguiente:
El geocodificador de Apple no responde a todas las solicitudes de la misma manera. En su lugar, las primeras solicitudes de un determinado dispositivo se responden rápidamente, pero si el dispositivo ha enviado 100 solicitudes o más, las respuestas llegan más y más lentas o las solicitudes no se responden en absoluto, lo que podría causar su error.
Cuando vuelve a cargar el controlador de vista, esto simplemente lleva tiempo, y el servidor de geocodificación está más dispuesto a responder nuevamente. Esencialmente, no puede hacer nada al respecto, ya que el servidor geocoder quiere protegerse de las sobrecargas de solicitudes desde un solo dispositivo. Simplemente tenía que limitar el número de solicitudes que envía allí.
Por cierto: los docs dicen "no debes enviar más de una solicitud de geocodificación por minuto".
Tuve este problema al elegir la ubicación para la aplicación de mensajería. Mi solución fue introducir un retraso de 3 segundos, después de que el usuario detuviera el mapa panorámico, antes de la llamada del geocodificador. Para garantizar que el usuario quiere exactamente esa ubicación.