Подтвердить что ты не робот

Ошибка 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 не будет перезагружен. Почему это может произойти, и что я могу сделать, чтобы разрешить это?

4b9b3361

Ответ 1

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

Ответ 2

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