ios - 从 PHAsset 获取缩略图

标签 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 左右,这就是卡住发生的地方。我不确定为什么会发生这种情况,但确实如此。

对于这两个问题的任何意见都将受到高度赞赏。

最佳答案

It does the job twice for some reason

因为这就是它应该做的。正如您所发现的,从照片库中获取图像需要时间。因此,默认行为是我们尽快提供低分辨率图像,以便您有东西可以显示;然后我们会再次调用,可能会调用几次,并提供质量更好的图像版本。此外,提取是异步形成的。因此,很有可能同时发生多个获取请求,这可能会导致您的代码开始绊倒,正如您所发现的。

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

关于ios - 从 PHAsset 获取缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686524/

相关文章:

ios - shouldChangeCharactersInRange 接受单个 '.'

ios - Swift App Xib - 第二个 ViewController - 标签未显示 30 秒,但按钮等显示。我该如何解决?

ios - 如何在单例方法中实现 AVAudioPlayer?

ios - 当从 uitableviewcell 按下 UIButton 时,如果有任何一个从其他单元格播放,则停止其他声音

Swift 委托(delegate)协议(protocol)无法防止保留周期问题

iOS:使用 LaunchImage 作为应用背景

ios - CGImageCreate 测试模式不工作 (iOS)

ios - 从 Firebase 数据库检索整数什么也没有

ios - IBInspectable setTitle :forState on UIButton not working

ios - 如何从 Swift 中的警报框中检索输入?