ошибка kCLErrorDomain 2 после повторного геокодирования с помощью 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
    }];
}

это работает в первые несколько символов, которые пользователь вводит в поле поиска. Однако после того, как пользователь вводит больше символов повторно, геокодер начинает давать следующую ошибку (что, как я знаю, означает, что была проблема с сетью):

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

геокодер не будет работать снова, пока не будет перезагружен весь ViewController. Почему это может произойти, и что я могу сделать, чтобы решить эту проблему?

2 ответов


Я считаю, что причина заключается в следующем:
Геокодер Apple не отвечает на каждый запрос одинаково. Вместо этого на первые запросы от определенного устройства отвечают быстро, но если устройство отправило, скажем, 100 запросов или более, ответы поступают медленнее и медленнее или запросы вообще не отвечают, что может привести к вашей ошибке.
Когда вы перезагружаете контроллер представления, это просто занимает время, и сервер геокодирования более готов ответить снова. По сути, вы ничего не могу с этим поделать, так как геокодер север хочет защитить себя от перегрузки запросами с одного устройства. Вам просто нужно было ограничить количество запросов, которые вы отправляете туда.
BtW: у docs скажите: "вы не должны отправлять более одного запроса геокодирования в минуту".


У меня была эта проблема при выборе местоположения для приложения messenger. Мое решение состояло в том, чтобы ввести задержку в 3 секунды, после того, как пользователь остановит панорамирование карты, перед вызовом геокодера. Чтобы убедиться, что пользователь хочет именно это место.