38

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

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

4

4 に答える 4

70

その理由は次のとおりだと思います
。Apple のジオコーダは、すべてのリクエストに同じように応答するわけではありません。代わりに、特定のデバイスからの最初のリクエストはすぐに応答されますが、デバイスがたとえば 100 個以上のリクエストを送信した場合、応答の到着がますます遅くなるか、要求がまったく応答されないため、エラーが発生する可能性があります。
ビュー コントローラーをリロードすると、単純に時間がかかり、ジオコーディング サーバーはより積極的に応答します。ジオコーダ サーバーは、単一のデバイスからの要求によって過負荷になるのを防ぎたいため、基本的には何もできません。そこに送信するリクエストの数を制限する必要がありました。
ところで:ドキュメントには、「1 分間に複数のジオコーディング リクエストを送信しないでください」と記載されています。

于 2013-07-25T20:30:48.970 に答える
2

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

于 2018-01-18T10:55:11.280 に答える