我使用ASIHTTPRequest
在队列中发送100+未决请求,但服务器有一个限制,即单个IP在一分钟内不能发送超过5个请求。我如何通过使用ASIHTTPRequest
和ASINetworkQueue
来保证这一点?想法吗?
提前谢谢你。
凯。你能做的就是构建你的请求并将它们存储在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];
希望这对你有帮助。
我不认为NSOperationQueue的ASINetowrkQueue让你直接这样做,所以你有两个选择:
- 子类NSOperationQueue/ASINetworkQueue并添加支持限制每分钟的请求,看看他们已经做的带宽节流。
- 每分钟只添加5个操作到队列-创建100+ asihttprequest的列表,将其中5个添加到ASINetworkQueue并跟踪它们何时完成使用委托。
的解决方案2)可能更容易做到,因为你不需要挖掘ASI代码,但1)绝对是干净的,你可以与其他人分享代码,我相信会发现它很有用。