Viele, wenn nicht die meisten Webservices haben ein Ratenlimit für Clients. Delicious sagt, ein Client kann eine Anfrage pro Sekunde machen; Twitter hat Grenzen pro Endpunkt; Ich bin sicher Facebook und Flickr und Foursquare haben ihre eigene Idee.Wie beziehe ich meine iOS-Netzwerkanforderungen auf eine Sekunde ein
Sie können eine iOS-Anwendung problemlos auf eine einzelne Anfrage beschränken, indem Sie eine NSOperationQueue
verwenden.
Aber wie schränkt man eine Anwendung darauf ein, sagen wir, nur eine Anfrage pro Sekunde?
Ich habe mir den Beispielcode von Apple, AFNetworking, ASINetwork und einigen anderen angeschaut, und keines scheint dieses Problem zu lösen. Das erscheint mir seltsam. Ich werde zugeben, dass ich etwas fehlen könnte sehr offensichtlich ...
Einige Parameter:
- Angenommen ich ein
NSOperationQueue
für den Netzbetrieb und die Anforderung ist einNSOperation
(könnte auch ein GCD sein ich nehme an, aber das ist, woran ich meistens gearbeitet habe) - Das gleiche Rate-Limit wird für jede Anfrage in der Warteschlange verwendet
- Ich bin auf der Suche nach einer Lösung in iOS, aber allgemeine Ideen könnten nützlich sein
Mögliche Lösungen:
sleep
Anweisung in derNSOperation
(es ist eine Warteschlange/Thread so würde dies nichts anderes blockieren)NSTimer
imNSOperation
performSelector:
in derNSOperation
(I patched ASINetworking to use this approach , obwohl ich es nicht verwende und die Änderung nicht stromaufwärts geschoben habe)- Starten/stoppen Sie die Warteschlange (mit KVO?), um sicherzustellen, dass die Rate limi t wird nicht überschritten
- Special "Schlaf"
NSOperation
. Dies wäre eine Aufgabe, die die nächste Netzwerkbetrieb abhängig wäre, auf - vollständig die Rate Limit ignorieren und nur ein bisschen Pause, wenn Sie die „überschritten Rate Limit“ Fehlerreaktion
Diese alle scheinen, ziemlich chaotisch. Vorgänge, die in den Ruhezustand versetzt werden, würden wahrscheinlich Formen von Warteschlangen "Priorität" verhindern. Das Starten/Stoppen der Warteschlange scheint fragil zu sein. Das Limit zu ignorieren ist unhöflich.
Um klar zu sein, habe ich dieses Problem gelöst. Aber die Lösung scheint "unordentlich" und etwas zerbrechlich. Ich würde gerne wissen, ob es eine bessere, sauberere Option gibt.
Ideen?
Vielen Dank für Ihre Hilfe. Das sieht ziemlich genau so aus, wie ich es mir für meine Option 2 vorgestellt habe, aber da Sie genau zeigen, wie es geht, und es keine abweichenden Ansichten gibt, werde ich Ihre Antwort akzeptieren. –