NSURLConnection + NSMutableData для загрузок файла является действительно медленным

В основном то, что происходит, - то, что я должен загрузить целый набор файлов в моем приложении, и я создал своего рода очередь, которая загружает каждый файл NSURLConnection и хранит ответ сервера инкрементно в NSMutableData, пока загрузка не закончена и затем пишет все это в диск.

Вот соответствующие части:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)_response {
    response = [_response retain];
    if([response expectedContentLength] < 1) {
        data = [[NSMutableData alloc] init];
    }
    else {
        data = [[NSMutableData dataWithCapacity:[response expectedContentLength]] retain];
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_data {
    [data appendData:_data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"saved: %@", self.savePath);
    [data writeToFile:self.savePath atomically:YES];
}

Какое-либо понимание относительно того, почему это было бы ужасно медленно? Это довольно плохо со Средством моделирования и становится еще хуже на существующем устройстве. Мой максимальный размер загрузки составляет приблизительно 2 мегабайта, таким образом, я изобразил хранение всего этого в памяти, пока это не заканчивается, не был бы то, что плохо идеи. Это добирается о 20KB/s в лучшем случае (с прямым специальным соединением Wi-Fi).

Править: во всех моих тестовых сценариях я действительно получаю заголовок Довольной Длины, таким образом, это не вопрос роста NSMutableData с каждым битом полученного ответа.

Редактирование 2: это - вся Акула, дает мне.

Редактирование 3: Таким образом, это - то, как я настроил соединение

NSMutableURLRequest *request = [[NSMutableURLRequest requestWithURL:[NSURL URLWithString:[@"http://xxx.xxx.xxx.xxx/index.php?service=" stringByAppendingString:service]]] retain];

[request setHTTPMethod:@"POST"];
[request setHTTPBody:[[options JSONRepresentation] dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
[conn start];

Конечно, я на самом деле не имею hardcoded URL и обоих запросов и веду, переменные экземпляра класса загрузчика. Не то, чтобы это должно иметь значение, но для JSON я использую http://code.google.com/p/json-framework/. Опции и сервис являются параметрами метода (NSString и NSDictionary), не, что они должны иметь значение также.

1
задан Joonas Trussmann 21 July 2010 в 10:19
поделиться

2 ответа

Боже, как неловко. Оказывается, мой заголовок Content-Length был неточным, что привело к тому, что NSURLConnection пришлось ждать какого-то таймаута до завершения работы, хотя у него были все данные. В общем-то, все логично. Возможно, это поможет кому-то еще.

2
ответ дан 2 September 2019 в 22:55
поделиться

Я бы профилировал, чтобы узнать, где происходит замедление и по какой схеме. Поместите оператор журнала в соединение : didReceiveData , чтобы увидеть, как часто он вызывается. Вы ищете:

  1. Относительное время, прошедшее между вызовами метода.
  2. Увеличивается ли время между вызовами по мере работы приложения.

Если приложение проводит большую часть времени между вызовами, то узким местом является сам запрос. Либо запрос неправильно настроен, либо сервер не отправляет быстро.

Если время между вызовами увеличивается с увеличением времени работы приложения, вероятно, это проблема памяти. По мере того, как объем данных увеличивается, а объем памяти становится все более ограниченным, приложение должно загружать и выгружать больше данных из памяти, что все замедляет. Для проверки зарегистрируйте различные методы didReciveMemoryWarning в любых активных объектах.


Обновление:

Согласно Shark, проблема в вашем URL-запросе, а не в опубликованном вами коде. Вам нужно посмотреть, как вы настраиваете запрос.

0
ответ дан 2 September 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: