从文件URL中检索ALAsset或PHAsset

10
在Photos.app中选择要传递给动作扩展的图像似乎会产生磁盘上的图像路径(例如:file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG)。是否有方法获取相应的ALAsset或PHAsset?
URL看起来像是对从调用PHImageManager.requestImageDataForAsset获得的PHImageFileURLKey条目进行对应。我不想通过迭代所有PHAssets来找到它。

那是一个NSURL。你不知道如何从那里获取到PHAsset吗? - matt
我不知道。有一个 fetchAssetsWithALAssetURLs 方法,但它只接受 assets-library:// 格式的 URL。 - Duc
ALAssetsLibrary的assetForURL怎么样? - matt
我可能有点疯狂,但看起来iOS 8中所有这些照片扩展都没有被分配文件URL并执行它们所做的操作。你问过那个问题吗? - Clay Bridges
没错。事实上,照片编辑扩展确实提供了PHAsset(或其他一些PhotoKit内容)。然而,我想同时处理多张照片(即,点击选择按钮并轻点几张照片),为此您需要共享或操作扩展。对于这些情况,我可以理解拥有文件的重要性:您可能会将它们上传到某个地方或对实际数据进行一些处理。 - Duc
显示剩余2条评论
2个回答

5

我做了我不想做的事情,匆忙地实现了这个愚蠢的搜索方法。虽然它很可怕、很慢,并且在照片库很大的时候会给我带来内存问题,但它确实有效。

作为 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
所以这是对你的自动回复("refinement tips")的评论。SO的评论不适合用于代码示例,因此我们来到这里。
  1. You can replace your for-index loop with a simpler for-each loop. E.g. something like:

    for asset in PHAsset.fetchAssetsWithOptions(nil)
    
  2. As of the last time I checked, the key in info["PHImageFileURLKey"] is undocumented. Be apprised. I don't think it will get you rejected, but the behavior could change at any time.


1
谢谢笔记。我肯定更喜欢 for..in 语法,但是 PHFetchResult 没有实现 Generator 协议,因此无法以这种方式迭代(除非最近有什么变化)。 - Duc
我无法让它工作。而且,这个答案表明,你需要SequenceType(而不是Generator)来使甚至符合NSFastEnumeration的类型可迭代。 - Duc
编辑的注释,次序错了:@Soybean 我现在只能谈论 Objective-C,在那里,它将是 NSFastEnumeration,而且是的,它确实有:@interface PHFetchResult : NSObject <NSCopying, NSFastEnumeration> :) - Clay Bridges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接