У меня есть приложение, которое я пишу, и мне нужно будет загрузить много изображений, возможно, 10000. Прямо сейчас я могу получить около 3000, прежде чем у меня не хватит памяти и приложение зависнет, зависит только от размеров файлов изображений. Я загружаю их в фоновом потоке и показываю прогресс пользователю.
Я написал вспомогательный класс, к которому я обращаюсь, и задаюсь вопросом, в этом ли моя проблема, и я просто теряю память.
Вот мой цикл загрузки изображений - он работает в фоновом потоке, все это внутри NSAutoReleasePool:
for (int j=0; j < [items count]; j++)
{
ImagesHelper *helper = [[ImagesHelper alloc]init];
[helper downloadImages: [[items objectAtIndex:j] valueForKey:@"ItemSKU"] withManufacturer: [[manufacturers objectAtIndex:i] ManufacturerID]];
[helper release];
if (j%50==0) { //this notifies the user of progress
statusMessage = [NSString stringWithFormat:@"Downloading images: %@.jpg (%d of %d)", [[items objectAtIndex:j] valueForKey:@"ItemSKU"],j+1, [items count]];
[self performSelectorOnMainThread:@selector(setStatus) withObject:nil waitUntilDone:YES];
}
}
Вот мой класс помощника:
-(void) downloadImages:(NSString *)ItemSKU withManufacturer: (NSString *) aManufacturerID{
NSData *imageData = nil;
NSData *imageDataLarge=nil;
NSString *fileName = [NSString stringWithFormat:@"%@_tn.jpg", [ItemSKU stringByReplacingOccurrencesOfString:@" " withString:@""]];
NSString *fileNameLarge = [NSString stringWithFormat:@"%@_lg.jpg", [ItemSKU stringByReplacingOccurrencesOfString:@" " withString:@""]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *savePath = [documentsPath stringByAppendingPathComponent:fileName];
NSString *savePathLarge = [documentsPath stringByAppendingPathComponent:fileNameLarge];
/* go get the image */
NSString *URL = [NSString stringWithFormat:kProductImagesURL,aManufacturerID, fileName];
NSString *URLLarge = [NSString stringWithFormat:kProductImagesURL,aManufacturerID, fileNameLarge];
NSLog(@"Going to get the file: %@",URL);
imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];
if (imageData!=nil) {
[imageData writeToFile:savePath atomically:YES];
}
imageDataLarge = [NSData dataWithContentsOfURL:[NSURL URLWithString:URLLarge]];
if (imageDataLarge!=nil) {
[imageDataLarge writeToFile:savePathLarge atomically:YES];
}
imageData = nil;
imageDataLarge=nil;
}
Все еще пытаюсь овладеть некоторыми из этих концепций.