L'application iOS est limitée par les searchs locales

MKErrorDomain error 3 -automatique (une search par nouveau caractère ajouté) dans une application qui search des adresses, et je continue d'get l' MKErrorDomain error 3 , qui est MKErrorLoadingThrottled . Cette erreur, selon Apple dev , se produit lorsque

Les données n'ont pas été chargées car la limitation des données est en vigueur. Cette erreur peut se produire si une application effectue fréquemment des requests de données sur une courte période.

Je sais exactement combien de requests sont effectuées, une pour chaque nouveau personnage dans la requête de search (comme si vous vous attendiez à ce que la saisie semi-automatique fonctionne). Bien sûr, je suis un typer rapide, mais être capable de bash la limite après seulement 10 ou 15 requests semble absurde. En regardant les deux references de source suivantes, je ne comprends pas pourquoi je continue à être étranglé.

Selon Apple dev :

Il n'y a pas de limites de request par application ou identifiant de développeur, donc les applications bien écrites qui fonctionnent correctement ne devraient rencontrer aucun problème. Toutefois, la limitation peut se produire dans une application mal écrite qui crée un nombre extrêmement élevé de requests.

et comme James Howard a déclaré à une WWDC:

Et l'autre chose dont je veux parler est les limites d'utilisation sur cette API. Donc, je suis heureux d'annoncer qu'il n'y a aucune limite d'utilisation d'application ou d'identifiant de développeur. Donc, si vous avez une application qui a beaucoup d'users et que vous voulez faire beaucoup de requests, c'est bien.

Ça va marcher.

Et la limitation que nous avons est vraiment juste une première ligne de défense contre les applications buggy. Donc, si vous mettez des requests de directions ou des requests de search locales dans une boucle infinie, vous avez un bug, finalement vous allez être limité.

Mais si vous faites quelque chose de raisonnable, vous dites oh, je vais juste faire des directions en réponse aux commentaires des users et vous savez que vous pouvez en faire quelques-uns parce que nous leur avons montré cet exemple.

Comme nous avons demandé deux directions en réponse à une input de l'user, c'est bien. Mais, vous savez si vous en faites 10 000 chaque fois que l'user tape sur l'écran, alors vous allez être limité. Mais, gardez-le raisonnable et tout ira bien.

Des idées pour savoir pourquoi cela se passe ??

L'auto-complétion nécessite une API spéciale. MapKit n'offre pas une telle interface. Le simple fait d'envoyer des dizaines de requêtes à l'API de search normale entraîne une charge énorme.

Vous avez essentiellement deux options:

  1. Aller avec Google Adresses Ils ont une API dédiée à l' auto-complétion des lieux . Il y a même une bibliothèque complète pour iOS sur GitHub .

  2. Réduisez le nombre de requests, par exemple en envoyant une requête seulement si l'user a mis en pause la saisie depuis 300ms et seulement si aucune requête précédente n'est en attente. Mais ce n'est toujours pas une garantie qu'Apple ne limitera pas vos requests.

MKLocalSearch est principalement destiné à la search de points d'intérêt (entresockets, etc.) dans les limites d'une carte. CLGeocoder est destiné aux searchs structurées d'adresse et de localization.

La documentation de CLGeocoder spécifie que les requests de CLGeocoder sont limitées en termes de débit, et la documentation fournit des conseils sur la façon d'être un bon citoyen.

On notera en particulier le premier élément des lignes direcsortingces: "Envoyer au maximum une requête pour toute action de l'user". Cela devrait également être appliqué à MKLocalSearch – si vous avez plusieurs requests en même time, vous risquez fort d'être limité.

C'est en fait assez facile à implémenter: Avant d' MKLocalSearchRequest un nouveau MKLocalSearchRequest , annulez toutes les requests en attente. Cela a beaucoup de sens pour implémenter la saisie semi-automatique comme vous le décrivez: si l'user entre le 4ème caractère, vous n'avez probablement pas besoin de la requête ou de la réponse pour le 3ème caractère.

Exécutez votre application dans l'outil Time Profiler et voyez combien d'appels à cette méthode sont effectués lorsque vous tapez.

Je viens d'écrire Helper on Swift pour aider à faire des suggestions avec l'API Apple MapKit. C'est la requête de search d'appel lorsque l'user arrête de taper la requête. https://github.com/ArniDexian/GeocodeHelper

L'utilisation est assez simple:

 func searchBar(searchBar: UISearchBar, textDidChange searchText: Ssortingng) { GeocodeHelper.shared.decode(searchText.sortingmmed(), completion: { [weak self](places) -> () in self?.dataSource.locations = places self?.tableView.reloadData() return }) }