1

我使用ASIHTTPRequest在隊列中發送了100個以上的待處理請求,但服務器有一個限制,即單個IP無法在一分鐘內發送超過5個請求。我如何通過使用ASIHTTPRequestASINetworkQueue來確保這一點?思考?如何確保在一分鐘內發送少於5個請求。

預先感謝您。

啓。

回答

0

我不認爲任何ASINetowrkQueue的NSOperationQueue讓那麼你有兩個選擇,你這樣做直接:

  1. 子類NSOperationQueue/ASINetworkQueue並添加限制每分鐘的請求的支持,看看帶寬限制他們已經做到了。
  2. 每分鐘只能向隊列添加5個操作 - 創建一個包含100個ASIHTTPRequests的列表,將其中的5個添加到ASINetworkQueue中,並在完成使用委託時跟蹤。

在解決方案2)可能更容易做到這一點,因爲您不必深入研究ASI代碼,但1)絕對更清潔,您可以與其他人共享代碼,我肯定會找到它很有用。

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]; 

希望這有助於。讓我知道是否出了問題。