如何确保在一分钟内发送少于5个请求。

时间:2011-07-29 07:47:37

标签: iphone objective-c asihttprequest nsoperation nsoperationqueue

我正在使用ASIHTTPRequest在队列中发送100多个待处理请求,但服务器有一个限制,即单个IP在一分钟内无法发送超过5个请求。如何使用ASIHTTPRequestASINetworkQueue来确保这一点?想法?

提前谢谢。

2 个答案:

答案 0 :(得分: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];

希望这会有所帮助。如果出现问题,请告诉我。

答案 1 :(得分:0)

我不认为ASINetowrkQueue的NSOperationQueue让你直接这样做,所以你有两个选择:

  1. 子类NSOperationQueue / ASINetworkQueue并添加对每分钟限制请求的支持,看看他们已经做过的带宽限制。
  2. 每分钟只向队列添加5个操作 - 创建100个ASIHTTPRequests的列表,将其中的5个添加到ASINetworkQueue并跟踪他们何时完成使用该委托。
  3. 解决方案2)可能更容易做,因为您不必深入研究ASI代码,但1)绝对更清晰,您可以与其他我认为会发现它有用的人共享代码。