Я использую библиотеку выбора изображений, чтобы пользователь мог выбрать много изображений из своей фотобиблиотеки. Они возвращаются в виде массива PHAssets
. Затем я хочу преобразовать все PHAssets
в UIImages
и записать их в хранилище приложения.Использование большого объема памяти через PHAssets и вызов requestImageForAsset
В настоящий момент я перебираю все активы и звоню requestImageForAsset
синхронно. Моя проблема в том, что при запуске этого цикла наблюдается невероятно высокий уровень использования памяти (с 30 изображениями, шипами до 130 МБ). Я хотел бы предотвратить это.
Вот мой код:
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++;
}
Основываясь на бревнах, я вижу, что все «начиная запрашивающего изображение х» называют первым, а затем все блоки завершения («закончил запрашивающий изображение х»). Я думаю, что это может повлиять на проблему памяти. Вероятно, было бы меньше памяти, чтобы гарантировать, что блок завершения для каждой итерации вызывается до освобождения этих ресурсов и перехода к следующей итерации. Как я могу это сделать?
Спасибо.Я попробовал @autoreleasepool в цикле for, но положил его туда и там, и обработчик результата сделал трюк! – Charles
Этот трюк не работает для меня. : -s –