【问题标题】:How to ensure sending less than 5 requests in a minute.如何确保在一分钟内发送少于 5 个请求。
【发布时间】:2011-07-29 07:47:36
【问题描述】:
我正在使用ASIHTTPRequest 在队列中发送 100 多个挂起的请求,但服务器有一个限制,即单个 IP 在一分钟内不能发送超过 5 个请求。我怎样才能通过使用ASIHTTPRequest 和ASINetworkQueue 来确保这一点?想法?
提前谢谢你。
启。
【问题讨论】:
标签:
iphone
objective-c
asihttprequest
nsoperation
nsoperationqueue
【解决方案1】:
您可以做的是构建您的请求并将它们存储在 AVMutableArray 中,然后有一个计时器每 15 秒 (15 * 5 = 60) 检查一次是否有任何请求。例如在你的 h 文件中你可以有类似的东西
@property (nonatomic, retain) NSTimer *queueTimer;
@property (nonatomic, retain) NSMutableArray *requestsQueue;
- (void)sendRequest;
在你的 m 文件中,你应该这样写:
@@synthesize queueTimer = _queueTimer;
@@synthesize requestsQueue = _requestsQueue;
- (void)viewDidLoad:
{
self.requestsQueue = [NSMutableArray array];
self.queueTimer = [NSTimer timerWithTimeInterval:15 target:self selector:@selector(sendRequest) userInfo:nil repeats:YES];
}
每当您创建请求而不是将它们发送到服务器时,您都将它们放入此数组中
[self.requestsQueue addObject:request];
这里是sendRequest 方法:
- (void)sendRequest
{
if ([self.requestsQueue count]) {
id request = [self.requestsQueue objectAtIndex:0];
// dispatch your request
[self.requestsQueue removeObject:request];
}
}
也不要忘记在你的 dealloc 方法中使计时器无效
[queueTimer invalidate];
希望这会有所帮助。如果出现问题,请告诉我。
【解决方案2】:
我认为 ASINetowrkQueue 的任何一个 NSOperationQueue 都不允许您直接执行此操作,因此您有两个选择:
- 子类 NSOperationQueue/ASINetworkQueue 并添加对限制每分钟请求的支持,看看他们已经做了带宽限制。
- 每分钟只向队列添加 5 个操作 - 创建一个包含 100 多个 ASIHTTPRequest 的列表,将其中的 5 个添加到 ASINetworkQueue 并跟踪它们何时完成使用委托。
在解决方案中,2) 可能更容易执行,因为您不必深入研究 ASI 代码,但 1) 绝对更干净,您可以与其他人共享代码,我相信他们会觉得它有用。