ios - 高内存使用循环通过 PHAsset 并调用 requestImageForAsset

标签 ios objective-c memory phasset

我正在使用图像选择器库来允许用户从他们的照片库中选择许多图像。它们以 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/

相关文章:

ios - CoreStore transaction.edit 建议使用相同变量名的注释可以防止我们误用非事务实例

c++ - 未记录的 API 和 header

objective-c - 如何隐藏 Cocoa 应用程序中的菜单栏?

ios - 呈现 ViewController 的 Xcode 问题

vb.net - 操作未成功完成,因为该文件包含病毒或可能不需要的软件。 (来自 HRESULT : 0x800700E1) 的异常

http - 释放未使用的内存?

iphone - 通过 MKPolyline 获取中间点

ios - 视频输入时拍照

ios - 停止/中止 NSURLConnection

c - Visual Studio : Different Size in Memory for same executable in XP and Windows7