Многие, если не большинство, веб-службы имеют ограничение скорости для клиентов. Delicious говорит, что клиент может сделать один запрос в секунду; У Twitter есть ограничения на конечную точку; Я уверен, что у Facebook и Flickr и Foursquare есть своя идея.
Вы можете легко ограничить приложение iOS одним запросом за раз, используя NSOperationQueue
.
Но как ограничить приложение созданием, скажем, только одного запроса в секунду?
Я рассмотрел пример кода Apple, AFNetworking, ASINetwork и некоторых других, и никто, кажется, не решает эту проблему. Мне это кажется странным. Я соглашусь, что я могу пропустить что-то очень очевидное...
Некоторые параметры:
- Предположим, что у меня есть
NSOperationQueue
для сетевых операций, а запрос -NSOperation
(также может быть очередь GCD, я полагаю, но это то, с чем я в основном работал) - Тот же предел скорости используется для каждого запроса в очереди
- Я ищу решение в iOS, но общие идеи могут быть полезны
Возможные решения:
-
sleep
вNSOperation
(это очередь/поток, поэтому это ничего не блокирует) -
NSTimer
вNSOperation
-
performSelector:
вNSOperation
(Я исправил ASINetworking, чтобы использовать этот подход, хотя я не использую его и не использовал нажмите изменение вверх по течению) - Запустить/остановить очередь (используя KVO?), чтобы убедиться, что предел скорости не превышен.
- Специальный "сон"
NSOperation
. Это будет задачей, согласно которой следующая операция сети будет зависеть от - Полностью проигнорировать ограничение скорости и немного приостановить, когда вы получите сообщение об ошибке "превышение скорости"
Все это кажется довольно грязным. Операции, которые спят, вероятно, будут препятствовать формам очереди "приоритет". Запуск/остановка очереди кажется хрупкой. Игнорирование ограничения является грубым.
Чтобы быть ясным, я решил эту проблему. Но решение кажется "грязным" и несколько хрупким. Я хотел бы знать, есть ли лучший, более чистый вариант.
Идеи?