Używam biblioteki wyboru obrazów, aby umożliwić użytkownikowi wybieranie wielu zdjęć z ich biblioteki zdjęć. Są one zwracane w postaci tablicy PHAssets
. Następnie chcę przekonwertować wszystkie PHAssets
na UIImages
i zapisać je w pamięci aplikacji.Korzystanie z dużej ilości pamięci przez zestawy PHA i wywoływanie requestImageForAsset
W tej chwili przeglądam wszystkie zasoby i synchronicznie synchronizuję numer requestImageForAsset
. Mój problem polega na tym, że podczas uruchamiania tej pętli występuje niesamowicie wysokie zużycie pamięci (przy 30 obrazach wzrasta do 130 MB). Chciałbym temu zapobiec.
Oto mój kod:
for(PHAsset *asset in self.assets) {
NSLog(@"started requesting image %i", i);
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:[self imageRequestOptions] resultHandler:^(UIImage *image, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
assetCount++;
NSError *error = [info objectForKey:PHImageErrorKey];
if (error) NSLog(@"Image request error: %@",error);
else {
NSString *imagePath = [appDelegate.docsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]];
NSData *imageData = UIImagePNGRepresentation(image);
if(imageData) {
[imageData writeToFile:imagePath atomically:YES];
[self.imagesArray addObject:imagePath];
}
else {
NSLog(@"Couldn't write image data to file.");
}
[self checkAddComplete];
NSLog(@"finished requesting image %i", i);
}
});
}];
i++;
}
podstawie dzienników, widzę, że cały „obrazek zaczynając wzywającego x” są nazywane, potem wszystkie bloki ukończenia („zakończył prośbą obrazu X”). Myślę, że to może przyczyniać się do problemu z pamięcią. Prawdopodobnie byłoby mniej pamięci wymagającej intensywności, aby upewnić się, że blok zakończenia każdej iteracji jest wywoływany przed zwolnieniem tych zasobów i przejściem do kolejnej iteracji. Jak mogę to zrobić?
Dzięki.Próbowałem @autoreleasepool w pętli for, ale umieszczenie go zarówno tam, jak i programu obsługi wyników, sprawiło, że trik! – Charles
Ta sztuczka nie działa dla mnie. : -s –