Как обеспечить отправку менее 5 запросов в минуту. - PullRequest
1 голос
/ 29 июля 2011

Я использую ASIHTTPRequest для отправки более 100 ожидающих запросов в очереди, но у сервера есть ограничение, что один IP-адрес не может отправлять более 5 запросов в минуту.Как я могу убедиться в этом, используя ASIHTTPRequest и ASINetworkQueue?Мысли?

Заранее спасибо.

Кай.

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Что вы можете сделать, это построить ваши запросы и сохранить их в 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];

Надеюсь, это поможет.Дайте мне знать, если что-то пошло не так.

0 голосов
/ 29 июля 2011

Я не думаю, что NSOperationQueue из ASINetowrkQueue позволяет вам делать это напрямую, поэтому у вас есть две опции:

  1. Подкласс NSOperationQueue / ASINetworkQueue и добавлена ​​поддержка ограниченных запросов в минуту, посмотрите нарегулирование пропускной способности, которое они уже выполняют.
  2. Добавьте только 5 операций в минуту в очередь - создайте список из 100+ запросов ASIHTTP, добавьте 5 из них в ASINetworkQueue и отследите, когда они завершат использование делегата.

Из решений 2) может быть проще сделать, потому что вам не нужно копаться в коде ASI, но 1) определенно чище, и вы могли бы поделиться кодом с другими людьми, которые, я уверен, найдут егополезно.

...