从文件URL中检索ALAsset或PHAsset

时间:2015-02-22 19:00:42

标签: ios8 ios8-extension photokit ios-extensions

选择Photos.app中的图像以传递给动作扩展名似乎会产生磁盘上图像的路径(例如:file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG)。有没有办法获得相应的ALAsset或PHAsset?

网址看起来与您通过调用PHImageFileURLKey获得的PHImageManager.requestImageDataForAsset条目相对应。我不想迭代所有的PHAsset来找到它。

2 个答案:

答案 0 :(得分:4)

我做了我不想做的事情并将这种愚蠢的搜索方法放在一起。虽然它很糟糕,但很慢,并且当照片库很大时会给我带来记忆问题。

作为Cocoa和Swift的菜鸟,我很欣赏细化技巧。谢谢!

func PHAssetForFileURL(url: NSURL) -> PHAsset? {
    var imageRequestOptions = PHImageRequestOptions()
    imageRequestOptions.version = .Current
    imageRequestOptions.deliveryMode = .FastFormat
    imageRequestOptions.resizeMode = .Fast
    imageRequestOptions.synchronous = true

    let fetchResult = PHAsset.fetchAssetsWithOptions(nil)
    for var index = 0; index < fetchResult.count; index++ {
        if let asset = fetchResult[index] as? PHAsset {
            var found = false
            PHImageManager.defaultManager().requestImageDataForAsset(asset,
                options: imageRequestOptions) { (_, _, _, info) in
                    if let urlkey = info["PHImageFileURLKey"] as? NSURL {
                        if urlkey.absoluteString! == url.absoluteString! {
                            found = true
                        }
                    }
            }
            if (found) {
                return asset
            }
        }
    }

    return nil
}

答案 1 :(得分:1)

因此,这是对您的自动回答的评论(&#34;改进提示&#34;)。所以请注意不要删除代码示例,所以我们就这样了。

  1. 您可以使用更简单的for-each循环替换for-index循环。例如。类似的东西:

    for asset in PHAsset.fetchAssetsWithOptions(nil)
    
  2. 自上次检查时,info["PHImageFileURLKey"]中的密钥未记录。得到通知。我不认为它会让你被拒绝,但行为可能会随时改变。