我正在使用图像选择器库来允许用户从他们的照片库中选择许多图像。它们以 PHAssets
数组的形式返回。然后,我想将所有 PHAssets
转换为 UIImages
并将它们写入应用程序的存储。
目前,我正在遍历所有 Assets 并同步调用 requestImageForAsset
。我的问题是,当这个循环运行时,内存使用量会出现非常高的峰值(30 张图像,它会达到 130MB)。我想防止这种情况发生。
这是我的代码:
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++;
}
根据日志,我看到首先调用所有“开始请求图像 x”,然后调用所有完成 block (“完成请求图像 x”)。我认为这可能会导致内存问题。确保在释放这些资源并移动到下一次迭代之前调用每次迭代的完成 block 可能会减少内存密集型。我该怎么做?
最佳答案
@Inder Kumar Rathore 技巧对我不起作用。 所以我尝试阅读更多关于 PHImageManager here
我发现如果我从
- requestImageForAsset:targetSize:contentMode:options:resultHandler:
到
- requestImageDataForAsset:options:resultHandler:
我将收到具有相同尺寸 {5376, 2688} 的图像,但字节大小要小得多。这样内存问题就解决了。
希望有帮助!!
(注意:[UIImage imageWithData:imageData] 使用这个将 NSData 转换为 UIImage)
关于ios - 高内存使用循环通过 PHAsset 并调用 requestImageForAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274791/