12

アドレスを検索するアプリにオートコンプリート (新しい文字が追加されるたびに 1 つの検索) を実装していMKErrorDomain error 3ますMKErrorLoadingThrottledApple devによると、このエラーは次の場合に発生します。

データ調整が有効なため、データはロードされませんでした。このエラーは、アプリが短期間に頻繁にデータを要求した場合に発生する可能性があります。

検索クエリの新しい文字ごとに 1 つずつ、作成されているリクエストの数を正確に把握しています (オートコンプリートが機能することを期待するのと同じように)。確かに、私はタイピングが速いのですが、わずか 10 ~ 15 回のリクエストで限界に達するというのはばかげているように思えます。次の 2 つのソース リファレンスを見ると、なぜ抑制され続けるのかわかりません。

Apple devによると:

アプリまたは開発者 ID ごとのリクエスト制限はないため、適切に作成されたアプリが正しく動作する場合、問題は発生しません。ただし、非常に多くのリクエストを作成する不適切に作成されたアプリでは、スロットリングが発生する可能性があります。

ジェームス・ハワードが WWDC で言ったように:

もう 1 つお話ししたいのは、この API の使用制限です。そのため、アプリケーション ID または開発者 ID の幅広い使用制限がないことを発表できることを嬉しく思います。したがって、多くのユーザーがいるアプリがあり、多くのリクエストを実行したい場合は問題ありません。

うまくいきます。

そして、私たちが行っているスロットリングは、実際にはバグのあるアプリに対する防御の第一線にすぎません。したがって、ルート リクエストまたはローカル検索リクエストを無限ループに入れると、バグが発生し、最終的にはスロットリングされます。

しかし、合理的なことをすると、ユーザーの入力に応じて道案内をするだけで、その例を示したので、それらのいくつかを実行できることがわかります。

1 つのユーザー入力に対して 2 つの方向の要求を行ったように、それで問題ありません。しかし、ユーザーが画面をタップするたびに 10,000 を実行している場合、スロットルが発生します。しかし、それを合理的に保つだけで大丈夫です。

なぜこれが起こっているのかについてのアイデアはありますか??

4

4 に答える 4

12

オートコンプリートには特別な API が必要です。MapKit はそのようなインターフェースを提供しません。通常の検索 API に対して数十のリクエストを発行するだけで、膨大な負荷が発生します。

基本的に次の 2 つのオプションがあります。

  1. Google プレイスをご利用ください。専用のPlaces Autocompletion APIがあります。GitHubには iOS 用の完全なライブラリもあります。

  2. 要求の数を減らします。たとえば、ユーザーが 300 ミリ秒入力を一時停止した場合にのみ要求を送信し、それ以前の未解決の要求がない場合にのみ要求を送信します。しかし、Apple があなたのリクエストを抑制しないという保証はありません。

于 2014-05-10T15:43:50.180 に答える
4

MKLocalSearch主に、マップの範囲内で関心のあるポイント (ビジネスなど) を見つけることを目的としています。CLGeocoder は、構造化された住所と場所のルックアップ用です。

CLGeocoderのドキュメントでは、CLGeocoder のリクエストレート制限されていることが明記されており、ドキュメントは善良な市民になる方法についてのガイダンスを提供しています。

特に注目すべきは、ガイドラインの最初の項目である「ユーザーのアクションに対して最大 1 つのリクエストを送信する」です。これは同様に適用する必要がありMKLocalSearchます - 同時に複数のリクエストが進行中の場合、スロットリングされる可能性が非常に高くなります。

これは実際には非常に簡単に実装できます。新しいMKLocalSearchRequestものを送信する前に、保留中のリクエストをキャンセルします。これは、説明したようにオートコンプリートを実装するのに非常に理にかなっています。ユーザーが 4 番目の文字を入力している場合、おそらく 3 番目の文字の要求または応答は必要ありません。

于 2014-05-13T08:49:05.103 に答える
1

Time Profiler Instrument でアプリを実行し、入力時にそのメソッドが何回呼び出されているかを確認します。

于 2014-05-10T15:36:17.537 に答える