Как сохранить соединение с помощью ASIHTTP? Мне нужно сделать несколько запросов, но я не могу позволить себе открыть, а затем закрыть соединение запроса - PullRequest
3 голосов
/ 25 марта 2011

У меня есть метод, который я вызываю для отправки запросов веб-службы с помощью GET. Это выглядит так:

- (UIImage*)getImageWithSeriesGUID:(NSString*)seriesGUID ImageID:(int)imageID {

NSString * unescapedString = RIVERWOODS_GET_IMAGE(seriesGUID, imageID);

NSURL *url = [[NSURL alloc] initWithString:[unescapedString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];


ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setRequestMethod:@"GET"];
[request addRequestHeader:@"Connection" value:@"Keep-Alive"];

[request startSynchronous];
NSError *error = [request error];
if (!error) {
    NSData *response = [request responseData];
    //NSLog(@"Size: %@",[response length]);
    NSString *content = [[[NSString alloc] initWithData:response
                                               encoding:NSUTF8StringEncoding] autorelease];
    NSLog(@"Data: %@", content);
    UIImage *image = [UIImage imageWithData:response];
    return image;
}

return nil;
 }

Этот подход работает нормально, но он ДЕЙСТВИТЕЛЬНО медленно. С другой стороны, я перебираю цикл for, поэтому этот метод вызывается 20 раз, если массив изображений, который мне нужно собрать, содержит 20 изображений. Я стремлюсь повысить эффективность этого процесса и думаю, что смогу перебирать все идентификаторы изображений, которые мне нужно собрать прямо здесь, в этом методе.

Мне кажется, что причина, по которой это происходит так медленно, заключается в том, что многочисленные запросы, которые мы продолжаем открывать и закрывать. Изображения, которые я загружаю, в среднем составляют ~ 15 КБ.

Мой вопрос: Что я могу сделать, чтобы изменить этот метод, чтобы сделать его таким, чтобы я мог повысить эффективность и воспользоваться функциями поддержки активности HTTP? Я думаю, что вместо того, чтобы передавать идентификатор изображения, я могу просто передать счетчик массива, который мне нужно сделать, а затем установить цикл некоторых типов здесь в методе запроса, который затем позволил бы мне вернуться назад массив изображений ...

Это путь? Есть ли что-то, что мне не хватает? Я ценю вашу помощь и вклад !!

1 Ответ

6 голосов
/ 25 марта 2011

Причина, по которой это так чертовски медленно, заключается в том, что вы выполняете запросы синхронно (что в любом случае всегда является "нет-нет"), один за другим.Вам необходимо изменить метод загрузки, чтобы он работал асинхронно и одновременно.

Мой подход к запросу данных в сети следующим образом:

  • Создайте «контроллер» глобального сетевого подключения (доступный из вашего делегата приложения), который может создавать ASINetworkQueue на лету, когда это необходимо, и освобождать его, когда не осталось запросов
  • Обернуть ваши запросы в подкласс ASIHTTPRequest и переопределитьметоды done / fail в этих подклассах (при необходимости, заставьте их запускать уведомление с возвращенными данными; или запишите на диск и обновите базу данных с их ссылкой).
  • Для каждого запроса захватите ссылку на очередь идобавьте ваш запрос в очередь.
  • Очередь будет увеличиваться и уменьшаться по мере необходимости

Если бы я был за компьютером, я бы проверил пример на github, но на самом делеЕдинственной трудной частью является глобальный менеджер соединений, и ребята из ASI * написали отличный пример здесь на gist.gitхаб.Также, лучшее объяснение вышеизложенного (откуда я это узнал): здесь .

...