相关疑难解决方法(0)

高内存使用情况循环通过PHAssets并调用requestImageForAsset

我正在使用图像选择器库,允许用户从他们的照片库中选择许多图像.它们作为一个数组返回PHAssets.然后,我想将所有转换PHAssetsUIImages并将它们写入应用程序的存储.

目前,我正在遍历所有资产并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 …
Run Code Online (Sandbox Code Playgroud)

memory objective-c ios phasset

9
推荐指数
2
解决办法
4217
查看次数

如何从Swift中的ALAssetRepresentation获取低分辨率图像或缩略图

我正在使用ALAssetLibrary以从我的相机胶卷获取图像以获得我正在制作的自定义视图.这样做非常简单:

library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: {
        (group: ALAssetsGroup?, stop: UnsafeMutablePointer<ObjCBool>) in
        if group != nil {
            group!.setAssetsFilter(ALAssetsFilter.allPhotos())
            var indexSet = NSIndexSet(indexesInRange: NSMakeRange(0, group!.numberOfAssets() - 1))
            group!.enumerateAssetsAtIndexes(indexSet, options: nil, usingBlock: {
                (result: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) in
                if (result != nil) {
                    var alAssetRapresentation: ALAssetRepresentation = result.defaultRepresentation()
                    var url = alAssetRapresentation.url()
                    var iRef = alAssetRapresentation.fullResolutionImage().takeUnretainedValue()
                    var image = UIImage(CGImage: iRef)
                }
            })
        }
        }) { (NSError) -> Void in
    }
Run Code Online (Sandbox Code Playgroud)

所有这一切在模拟器中都很有效.但是在设备上,获得fullResolutionImage()证明是设备上的内存密集型并导致崩溃.我认为这很有意义,所有加载到内存中的数十个高分辨率图像都是一个糟糕的想法,所以我想缩小质量,只显示图像的缩略图.唯一的问题是我找不到从中获取缩略图的简单方法AlAssetRepresentation.

我正在尝试使用CGImageSourceCreateThumbnailAtIndex创建缩略图,但对如何执行此操作非常困惑.

任何帮助深表感谢!

ios alassetslibrary swift

5
推荐指数
1
解决办法
4752
查看次数

标签 统计

ios ×2

alassetslibrary ×1

memory ×1

objective-c ×1

phasset ×1

swift ×1