2013-07-25 6 views
21

Mam pasek wyszukiwania w mojej aplikacji, w którym użytkownik może wpisać adres, a pojawi się z geokodowanym wynikiem. Aktualizacje wynik jako typów użytkowników, zgodnie z poniższym kodem:KCLErrorDomain error 2 po geokodowaniu wielokrotnie z CLGeocoder

- (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 
    }]; 
} 

Działa to przez kilka pierwszych znaków użytkownik wpisze w polu wyszukiwania. Jednak po użytkownik wpisze więcej znaków wielokrotnie geocoder zaczyna podając następujący błąd (co wiem, oznacza to, że wystąpił problem z siecią):

ERROR during geocode: Error Domain=kCLErrorDomain Code=2 "The operation couldn’t be completed. (kCLErrorDomain error 2.)" 

geocoder nie działa ponownie, dopóki cała ViewController jest ponownie załadowany. Dlaczego tak się mogło stać i co mogę zrobić, aby go rozwiązać?

Odpowiedz

46

Wierzę, że powodem jest:
Geokodulator firmy Apple nie odpowiada na każde żądanie w ten sam sposób. Zamiast tego, pierwsze żądania z określonego urządzenia są szybko odbierane, ale jeśli urządzenie wysłało powiedzmy 100 żądań lub więcej, odpowiedzi przychodzą wolniej i wolniej lub żądania nie są w ogóle odbierane, co może spowodować błąd.
Po ponownym załadowaniu kontrolera widoku zajmuje to po prostu czas, a serwer geokodujący chętniej odpowiada. Zasadniczo nie można nic z tym zrobić, ponieważ serwer geokodera chce zabezpieczyć się przed przeciążeniem przez żądania z jednego urządzenia. Po prostu musiałaś ograniczyć liczbę wysyłanych przez ciebie żądań.
BTW: The docs mówią "nie powinieneś wysyłać więcej niż jednego żądania geokodowania na minutę".

+0

O tak, nie zauważyłem tej linii w dokumentach. Ma doskonały sens. – jburns20

+1

Na pewno żałuję, że nie było okresu karencji na tydzień lub dwa podczas opracowywania: ( –

0

Miałem ten problem podczas wybierania lokalizacji dla aplikacji posłańca. Moim rozwiązaniem było wprowadzenie opóźnienia 3 sekund, po tym jak użytkownik przestał przesuwać mapę, przed wywołaniem geokodera. Aby upewnić się, że użytkownik chce dokładnie tej lokalizacji.

Powiązane problemy