De nombreux services Web, sinon la plupart, ont une limite de débit pour les clients. Delicious dit qu'un client peut faire une demande par seconde; Twitter a des limites par point final; Je suis sûr que Facebook et Flickr et Foursquare ont leur propre idée.Comment limiter mes demandes de réseau iOS à une seconde
Vous pouvez facilement limiter une application iOS à une seule demande à la fois en utilisant un NSOperationQueue
. Mais comment limiter une application à faire, disons, une seule requête par seconde? J'ai regardé l'exemple de code par Apple, AFNetworking, ASINetwork et quelques autres, et aucun ne semble résoudre ce problème. Cela me semble étrange. Je reconnais que je ne pouvais manquer quelque chose très évident ...
Certains paramètres:
- Supposons que j'ai un
NSOperationQueue
pour les opérations de réseau et la demande est unNSOperation
(pourrait aussi être un GCD file d'attente je suppose, mais c'est ce que j'ai surtout travaillé avec) - La même limite de taux est utilisée pour chaque requête dans la file d'attente
- Je cherche une solution dans iOS, mais des idées générales pourraient être utiles
solutions possibles:
- déclaration
sleep
dans leNSOperation
(c'est une file d'attente/thread donc ce ne serait pas bloquer quoi que ce soit d'autre) NSTimer
dans leNSOperation
performSelector:
dans leNSOperation
(I patched ASINetworking to use this approach , bien que je ne l'utilise pas et n'ai pas poussé le changement en amont)- Démarrer/arrêter la file d'attente (en utilisant KVO?) pour vous assurer que le taux limi t n'est pas dépassé
- Spécial "sommeil"
NSOperation
. Ce serait une tâche que la prochaine opération de réseau dépendrait - ignorer complètement la limite de vitesse et juste une pause un peu quand vous obtenez la réponse d'erreur « limite de vitesse dépassé »
Ces tous semblent tout à fait désordre. Les opérations en veille empêcheront probablement les formes de file d'attente "prioritaires". Démarrer/arrêter la file d'attente semble fragile. Ignorer la limite est grossier.
Pour être clair, j'ai résolu ce problème. Mais la solution semble "désordonnée" et plutôt fragile. J'aimerais savoir s'il existe une meilleure option, plus propre.
Des idées?
Un grand merci pour votre aide. Cela ressemble beaucoup à ce que j'avais en tête pour mon option 2 mais puisque vous montrez exactement comment le faire et qu'il n'y a pas de points de vue divergents, je vais accepter votre réponse. –