从PHAsset

时间:2015-09-21 02:33:40

标签: ios swift swift2 phasset

我尝试从PHAsset获取缩略图以及其他一些信息。 这是一个简化的代码段。

对于我从相机胶卷中检索的所有图像,请执行以下操作:

static func fetchAsset(asset: PHAsset)
{
        if(asset.mediaType == PHAssetMediaType.Image){
            let screenScale: CGFloat = UIScreen.mainScreen().scale
            let imageSize = CGSize(width: 100 * screenScale, height: 100 * screenScale)

            let options: PHImageRequestOptions = PHImageRequestOptions()
            options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
            options.resizeMode = PHImageRequestOptionsResizeMode.Fast
            options.synchronous = false

            PHImageManager.defaultManager().requestImageForAsset(asset,
                targetSize: imageSize,
                contentMode: PHImageContentMode.AspectFill,
                options: options,
                resultHandler: { (result, info) -> Void in
                    if (result != nil && result!.scale == screenScale) {

                        var newItemImage = MyImage(isLocal:true)
                        if let fname = asset.valueForKey("filename") as? String{
                            newItemImage.fileName = fname
                        }
                        newItemImage.thumbnail = result
                        asset.requestContentEditingInputWithOptions(PHContentEditingInputRequestOptions()) { (contentEditingInput, info) -> Void in

                            //Get full image
                            let url = contentEditingInput!.fullSizeImageURL

                            newItemImage.url = url
                        }
                        //DO SOMWTHING WITH IMAGE
                    }else
                    {
                        //DO SOMWTHING ELSE
                    }
            })
        }
    }

我现阶段遇到两个问题:

  1. 最重要的一个,但我认为这是结果。它也需要 大部分处理能力和光盘读取。它运作良好 模拟器。但是当我在测试设备(iPhone 5,4S)上运行它时 有300-500张图像,它会冻结一两分钟 所有的图像。我想它通过整个集合读取 一,调整大小并获取所有这些信息。有更简单的方法吗?就像使用ALAsset一样,我可以直接获得缩略图并快速飞行。
  2. 出于某种原因,它完成了两次工作。首先,它给了我所要求的,小缩略图~60 * 40或左右。一旦它 给了我这个,几秒钟后,它又进行了另一个循环 并开始检索更高分辨率的图像,如960 * 640左右,以及发生冻结的地方。我不确定为什么会这样,但事实确实如此。
  3. 对这两个问题的任何意见都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

  

由于某种原因它完成了两次工作

因为那是它应该做的事情。正如您所发现的那样,从照片库中获取图像需要时间。因此,默认行为是我们尽快提供低分辨率图像,这样您就可以显示某些内容;然后,我们再次使用质量更好的图像再次调用几次。而且,提取是异步形成的。因此,完全有可能最终同时发生多次获取请求,这可能导致您的代码开始磕磕绊绊,正如您所发现的那样。

如果您不喜欢,请将抓取选项synchronous设置为true - 但是您必须在后台队列中进行整个调用!通过在串行队列中执行此操作,您可以确保依次单独执行调用,并且每个图像将仅传送一次。而且,那时(并且只有那时)你的PHImageRequestOptions.DeliveryModeFastFormat将被遵守。在对您收到的图片做任何事情之前,不要忘记退回主线程!

答案 1 :(得分:0)

你也可以使用我写的这个扩展名:

import Photos

extension PHAsset {
    var thumbnailImage : UIImage {
        get {
            let manager = PHImageManager.default()
            let option = PHImageRequestOptions()
            var thumbnail = UIImage()
            option.isSynchronous = true
            manager.requestImage(for: self, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
                thumbnail = result!
            })
            return thumbnail
        }
    }
}