在 Photos.app 中选择图像以传递给动作扩展似乎会产生磁盘上图像的路径(例如:)file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG
。有没有办法获得相应的 ALAsset 或 PHAsset?
该 URL 看起来与PHImageFileURLKey
您从调用中获得的条目相对应PHImageManager.requestImageDataForAsset
。我不想必须遍历所有 PHAsset 才能找到它。
在 Photos.app 中选择图像以传递给动作扩展似乎会产生磁盘上图像的路径(例如:)file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG
。有没有办法获得相应的 ALAsset 或 PHAsset?
该 URL 看起来与PHImageFileURLKey
您从调用中获得的条目相对应PHImageManager.requestImageDataForAsset
。我不想必须遍历所有 PHAsset 才能找到它。
我做了我不想做的事情,把这种愚蠢的搜索方法放在一起。它可以工作,尽管它很糟糕,很慢,并且当照片库很大时会给我带来内存问题。
作为 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
}
因此,这是对您的自动回答(“优化提示”)的评论。SO 注释不适合代码示例,所以我们开始吧。
您可以用更简单的 for-each 循环替换您的 for-index 循环。例如:
for asset in PHAsset.fetchAssetsWithOptions(nil)
截至我上次检查时,输入的密钥info["PHImageFileURLKey"]
没有记录。获悉。我不认为这会让你被拒绝,但行为可能随时改变。