web-dev-qa-db-ja.com

CLGeocoderで繰り返しジオコーディングした後のkCLErrorDomainエラー2

アプリケーションにユーザーが住所を入力できる検索バーがあり、ジオコーディングされた結果が表示されます。次のコードに従って、ユーザーが入力すると結果が更新されます。

- (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全体が再ロードされるまで、ジオコーダーは再び機能しません。なぜこれが起こっているのでしょうか、そしてそれを解決するために私は何ができますか?

27
jburns20

その理由は次のとおりだと思います。
Appleのジオコーダーがすべてのリクエストに同じ方法で応答するわけではありません。代わりに、特定のデバイスからの最初のリクエストは迅速に応答されますが、デバイスがたとえば100リクエスト以上を送信した場合、応答の到着は遅くなり、リクエストがまったく応答されないため、エラーが発生する可能性があります。
View Controllerをリロードすると、これには単に時間がかかり、ジオコーディングサーバーは再び答える用意があります。ジオコーダーサーバーは、単一のデバイスからのリクエストによって過負荷にならないように保護する必要があるため、基本的には何もできません。そこで送信するリクエストの数を制限するだけで済みました。
BTW: docs は、「1分あたり複数のジオコーディングリクエストを送信しないでください」と言います。

53

この同じエラーは、デバイスがオフラインのときに返されることに注意してください。

4

メッセンジャーアプリケーションの場所を選択するときにこの問題が発生しました。私の解決策は、ユーザーがマップのパンを停止した後、ジオコーダーが呼び出す前に3秒の遅延を導入することでした。ユーザーがその場所を正確に望んでいることを確認します。

1
slobodans