Molti, se non la maggior parte, i servizi Web hanno un limite di velocità per i client. Delicious dice che un cliente può fare una richiesta al secondo; Twitter ha limiti per end-point; Sono sicuro che Facebook, Flickr e Foursquare hanno una loro idea.Come si limita il limite delle richieste della rete iOS a un secondo
È possibile limitare facilmente un'applicazione iOS a una singola richiesta alla volta utilizzando uno NSOperationQueue
.
Ma come si limita un'applicazione a fare, diciamo, solo una richiesta al secondo?
Ho esaminato il codice di esempio di Apple, AFNetworking, ASINetwork e alcuni altri, e nessuno sembra risolvere questo problema. Questo mi sembra strano. Ti concedo che potrei mancare qualcosa molto ovvio ...
Alcuni parametri:
- Si supponga Ho un
NSOperationQueue
per le operazioni di rete e la richiesta è unNSOperation
(potrebbe anche essere un GCD suppongo, ma è quello con cui lavoro principalmente) - Lo stesso limite di velocità viene utilizzato per ogni richiesta in coda
- Sto cercando una soluzione in iOS, ma le idee generali potrebbero essere utili
Possibili soluzioni:
sleep
economico nelNSOperation
(si tratta di una coda di/thread quindi questo non bloccherebbe qualsiasi altra cosa)NSTimer
nelNSOperation
performSelector:
nelNSOperation
(I patched ASINetworking to use this approach , anche se non lo sto usando e non ho spinto il cambiamento a monte)- Avvia/arresta la coda (usando KVO?) per assicurarti che il tasso sia limitato t non viene superato
- Speciale "sleep"
NSOperation
. Questo sarebbe un compito che il funzionamento della rete successivo sarebbe dipende - completamente ignorare il limite di velocità e solo mettere in pausa un po 'quando si ottiene il "limite di velocità superato" risposta di errore
Questi tutti sembrano piuttosto confusa. Le operazioni che dormono probabilmente impedirebbero forme di coda di "priorità". L'avvio/arresto della coda sembra fragile. Ignorare il limite è scortese.
Per essere chiari, ho risolto questo problema. Ma la soluzione sembra "disordinata" e alquanto fragile. Mi piacerebbe sapere se c'è un'opzione migliore e più pulita.
Idee?
Molte grazie per il vostro aiuto. Questo sembra più o meno quello che avevo in mente per la mia opzione 2 ma dal momento che mostri esattamente come farlo e non ci sono punti di vista dissenzienti, accetterò la tua risposta. –