从文件 URL 中检索 ALAsset 或 PHAsset

Posted

技术标签:

【中文标题】从文件 URL 中检索 ALAsset 或 PHAsset【英文标题】:Retrieve ALAsset or PHAsset from file URL 【发布时间】:2015-02-22 19:00:42 【问题描述】:

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

该 URL 看起来与您通过调用 PHImageManager.requestImageDataForAsset 获得的 PHImageFileURLKey 条目相对应。我不想必须遍历所有 PHAsset 才能找到它。

【问题讨论】:

这是一个 NSURL。您不知道如何从那里到达 PHAsset 吗? 我没有。有fetchAssetsWithALAssetURLs,但只需要assets-library:// URL。 嗯,比这更糟糕。由于沙盒,您甚至无法以这种方式进入库。 ALAssetsLibrary assetForURL 怎么样? 还需要 assets-library 方案(但这并没有阻止我:我尝试了 assetForURLfetchAssetsWithALAssetURLs 来踢球;没有骰子)。 【参考方案1】:

我做了我不想做的事情,并将这种愚蠢的搜索方法放在一起。它可以工作,尽管它很糟糕,很慢,并且当照片库很大时会给我带来内存问题。

作为 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

【讨论】:

【参考方案2】:

因此,这是对您的自动回答(“优化提示”)的评论。所以 cmets 不会为代码示例而削减它,所以我们开始吧。

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

    for asset in PHAsset.fetchAssetsWithOptions(nil)
    

    截至我上次检查时,info["PHImageFileURLKey"] 中的密钥未记录在案。获悉。我认为这不会让你被拒绝,但行为可能随时改变。

【讨论】:

感谢您的留言。我绝对更喜欢 for .. 的语法,但是 PHFetchResult 没有实现 Generator 协议,也不能这样迭代(除非最近发生了变化)。 我无法让它工作。而this answer 表示您需要 SequenceType(不是 Generator,结果是)以使 NSFastEnumeration-conformant 类型也可迭代。 已编辑评论,乱序:@Soybean 我现在只能与 Objective-C 交谈,但在那里,应该是 NSFastEnumeration,是的:@interface PHFetchResult : NSObject &lt;NSCopying, NSFastEnumeration&gt; :)跨度>

以上是关于从文件 URL 中检索 ALAsset 或 PHAsset的主要内容,如果未能解决你的问题,请参考以下文章

[库assetForURL:url resultBlock:^(ALAsset *asset) 不执行

在接收 ALAssetsLibraryChangedNotification 时从 ALAssetsGroupSavedPhotos 组中检索 ALAsset 时应用程序崩溃

使用 exif 将原始图像从 ALAsset 对象写入文档目录文件夹

如何使用 ALAsset 从图库访问智能文件夹

Swift:从 url 检索音频文件标记列表?

使用 ALAssetPropertyAssetURL 获取 ALAsset 的 UID URL