В основном то, что происходит, - то, что я должен загрузить целый набор файлов в моем приложении, и я создал своего рода очередь, которая загружает каждый файл 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), не, что они должны иметь значение также.
Боже, как неловко. Оказывается, мой заголовок Content-Length был неточным, что привело к тому, что NSURLConnection пришлось ждать какого-то таймаута до завершения работы, хотя у него были все данные. В общем-то, все логично. Возможно, это поможет кому-то еще.
Я бы профилировал, чтобы узнать, где происходит замедление и по какой схеме. Поместите оператор журнала в соединение : didReceiveData
, чтобы увидеть, как часто он вызывается. Вы ищете:
Если приложение проводит большую часть времени между вызовами, то узким местом является сам запрос. Либо запрос неправильно настроен, либо сервер не отправляет быстро.
Если время между вызовами увеличивается с увеличением времени работы приложения, вероятно, это проблема памяти. По мере того, как объем данных увеличивается, а объем памяти становится все более ограниченным, приложение должно загружать и выгружать больше данных из памяти, что все замедляет. Для проверки зарегистрируйте различные методы didReciveMemoryWarning
в любых активных объектах.
Согласно Shark, проблема в вашем URL-запросе, а не в опубликованном вами коде. Вам нужно посмотреть, как вы настраиваете запрос.