Как обработать несколько тысяч запросов NSURLConnection, загрузить изображения и сократить использование памяти - PullRequest
0 голосов
/ 23 февраля 2012

Я работаю над приложением, которое загружает ресурсы и записывает их на диск для последующего автономного использования, и это всегда пользовательский контент.В настоящее время мы работаем с контентом, где около 4000 JPG.Пользователь инициализирует загрузку контента на iPad, и в пользовательском интерфейсе есть индикатор выполнения, поэтому пользователь фактически ждет, пока это не будет сделано.Проблема в том, что около 180 - 190 МБ выделенной памяти вылетает.

Что я видел в инструментах, так это то, что CFData (хранилище) является основным виновником, и я понимаю, что CFData (хранилище) является кешем для запросов NSURLConnection,

Я пробовал:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

и

[[NSURLCache sharedURLCache] removeAllCachedResponses];

, а также настройку политики кэширования, без улучшений.

Для справкиВот как выглядит мой почтовый запрос:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"text/xml"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[xmlMessage dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];

//get response
NSHTTPURLResponse* urlResponse = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&httpError];

Любая помощь будет встречена аплодисментами.

1 Ответ

0 голосов
/ 23 февраля 2012

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

Если у вас есть цикл for или какой-либо другой цикл, обрабатывающий эти запросы, вы также можете создать более локальный пул автоматического выпуска в цикле и затем опустошить его непосредственно перед завершением цикла.Если вы сделаете это, и у вас есть данные, которые вы хотите сохранить за рамками этого цикла (и пула), вы должны сохранить их в цикле и перераспределить их через некоторое время.

на вашем уровне опыта, вы должны рассмотреть возможность сделать все это во вторичном потоке.Вы можете рассматривать каждую выборку как отдельную операцию, а затем использовать что-то вроде NSOperation и NSOperationQueue для управления ею.Таким образом, вы можете запускать несколько операций одновременно и не блокировать поток во время ожидания каждого ответа.

...