PhotoKit iOS8 - 使用“PHImageFileURLKey”检索图像
Posted
技术标签:
【中文标题】PhotoKit iOS8 - 使用“PHImageFileURLKey”检索图像【英文标题】:PhotoKit iOS8 - Retrieve image using the "PHImageFileURLKey" 【发布时间】:2014-11-21 16:13:38 【问题描述】:无论如何我可以使用从"PHImageFileURLKey"
返回的路径进入照片库并检索图像吗?
返回的路径格式如下:
"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG"
我的计划是将此路径存储在数据库中,并在需要取回图像时使用它来获取图像。
感谢任何帮助。谢谢!
【问题讨论】:
【参考方案1】:我认为您从 URL 中检索 Photo Kit 资产的解决方案是错误的。
这是我要做的(假设您可以访问 PHAsset):
存储本地标识符:
PHAsset *asset = /*Your asset */
NSString *localIdentifier = asset.localIdentifier;
//Now save this local identifier, or an array of them
当需要检索它们时,您只需执行以下操作:
PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:savedLocalIdentifiers options:nil];
[savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop)
//this gets called for every asset from its localIdentifier you saved
];
如果您只能访问“PHImageFileURLKey”,请忽略此答案。
【讨论】:
【参考方案2】:这没有记录在案,因此我强烈建议不要将该 URL 用于原型应用之外的任何内容。也就是说,这似乎确实有效:
dispatch_queue_t queue = dispatch_queue_create("photoLoadQueue", 0);
dispatch_async(queue, ^
NSURL *privateUrl = [NSURL URLWithString:@"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG";
NSData *imageData = [NSData dataWithContentsOfURL:privateUrl];
dispatch_async(dispatch_get_main_queue(), ^
self.imageView.image = [UIImage imageWithData:imageData];
);
);
当然,您需要将用于启动 url 的字符串替换为对您的手机有效的字符串。
这样做可能会有很多问题 - 这不是框架的使用方式。以下是我的一些想法:
-
在模拟器中运行时,根路径会在应用程序启动之间定期更改,因此如果您像这样存储 absoluteUrls,您的数据库将很快充满死 URL。这至少可以说是不方便的。
更糟糕的是,图像的 URL 可能会在真实设备上发生变化 - 你无法控制它,一旦它们发生变化,让用户重新选择它们或其他什么都是你的应用程序的错。
您永远不会发现照片来源的
PHAsset
的更改。
这可能会规避用户对照片的访问权限 - 如果您的应用访问照片的权限被撤销会怎样?然而,这可能是许多存储照片供以后使用的方法的问题。
您无法控制文件 - 如果用户删除它会怎样?
如果我是你,我会使用 PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:
从照片框架中正确检索图像,并将其存储在应用程序目录中的文件中,无论你在做什么,都以合理的分辨率存储它。这仍然不会给您带来资产更改,但这是一个很好的解决方案。
如果您想自己存储资产并仅在您真正需要它们时请求图像,那么可能值得研究 transient asset collections,尽管我没有使用它们,因此可能无法满足您的需求。
【讨论】:
感谢您的详细回复。在阅读了您提出的潜在问题后,我决定反对这种方法。相反,我使用 PHObject 上的“LocalIdentifier”属性来唯一标识图像并从库中获取它。我能够使用 fetchAssetsWithLocalIdentifiers: 方法将它们取回。 谢谢,我没见过,它也让我改进了我的应用程序!我喜欢这样。 您的代码导致Operation not permitted
错误。以上是关于PhotoKit iOS8 - 使用“PHImageFileURLKey”检索图像的主要内容,如果未能解决你的问题,请参考以下文章
PhotoKit:使用 requestImageForAsset 通过 PHImageManagerMaximumSize 获取资产时崩溃 [assetsd 被中断或死亡]