【问题标题】:How to ensure sending less than 5 requests in a minute.如何确保在一分钟内发送少于 5 个请求。
【发布时间】:2011-07-29 07:47:36
【问题描述】:

我正在使用ASIHTTPRequest 在队列中发送 100 多个挂起的请求,但服务器有一个限制,即单个 IP 在一分钟内不能发送超过 5 个请求。我怎样才能通过使用ASIHTTPRequestASINetworkQueue 来确保这一点?想法?

提前谢谢你。

启。

【问题讨论】:

    标签: 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 都不允许您直接执行此操作,因此您有两个选择:

      1. 子类 NSOperationQueue/ASINetworkQueue 并添加对限制每分钟请求的支持,看看他们已经做了带宽限制。
      2. 每分钟只向队列添加 5 个操作 - 创建一个包含 100 多个 ASIHTTPRequest 的列表,将其中的 5 个添加到 ASINetworkQueue 并跟踪它们何时完成使用委托。

      在解决方案中,2) 可能更容易执行,因为您不必深入研究 ASI 代码,但 1) 绝对更干净,您可以与其他人共享代码,我相信他们会觉得它有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2011-06-13
        相关资源
        最近更新 更多