许多(如果不是大多数)Web 服务对客户端都有速率限制。Delicious 表示客户端每秒可以发出一个请求;Twitter 对每个端点都有限制;我确信 Facebook、Flickr 和 Foursquare 都有自己的想法。
您可以使用NSOperationQueue
.
但是,您如何限制应用程序每秒仅发出一个请求?
我查看了 Apple、AFNetworking、ASINetwork 和其他一些示例代码,但似乎没有一个可以解决这个问题。这对我来说似乎很奇怪。我承认我可能遗漏了一些非常明显的东西......
一些参数:
- 假设我有一个
NSOperationQueue
网络操作并且请求是一个NSOperation
(我想也可能是一个 GCD 队列,但这是我一直在使用的) - 队列中的每个请求使用相同的速率限制
- 我正在寻找 iOS 中的解决方案,但一般的想法可能会有用
可能的解决方案:
sleep
中的语句NSOperation
(它是一个队列/线程,所以这不会阻塞其他任何东西)NSTimer
在里面NSOperation
performSelector:
在NSOperation
(我修补了 ASINetworking 以使用这种方法,尽管我没有使用它并且没有将更改推送到上游)- 启动/停止队列(使用 KVO?)以确保不超过速率限制
- 特殊的“睡眠”
NSOperation
。这将是下一个网络操作将依赖的任务 - 完全忽略速率限制,当您收到“超出速率限制”错误响应时暂停一下
这些看起来都很乱。休眠的操作可能会阻止“优先级”队列的形式。启动/停止队列似乎很脆弱。无视限制是粗鲁的。
需要明确的是,我已经解决了这个问题。但解决方案似乎“凌乱”且有些脆弱。我想知道是否有更好、更清洁的选择。
想法?