繁体   English   中英

PhotoKit iOS8-使用“ PHImageFileURLKey”检索图像

[英]PhotoKit iOS8 - Retrieve image using the “PHImageFileURLKey”

无论如何,我可以使用从"PHImageFileURLKey"返回的路径进入照片库并检索图像吗?

返回的路径采用以下格式:

"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG"

我的计划是将此路径存储在数据库中,并在需要取回图像时使用它来获取图像。

任何帮助表示赞赏。 谢谢!

我认为您从URL检索Photo Kit资产的解决方案是错误的。

这是我要做的(假设您可以访问PHAsset):

存储localIdentifier:

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”,请忽略此答案。

这没有记录,所以我强烈建议您不要将该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的字符串。

这样做可能会带来很多问题-并不是框架的使用方式。 这是我头上的一些东西:

  1. 在模拟器中运行时,根路径在应用程序的启动之间会定期更改,因此,如果您存储诸如此类的absoluteUrl,则数据库将很快充满无效URL。 至少可以这样说。
  2. 更糟糕的是,图像的URL可能会在真实设备上更改-您无法对其进行控制,一旦更改,则是应用程序让用户重新选择图像或其他原因的错误。
  3. 您将永远不会找到有关照片来源的PHAsset更改。
  4. 这可能会绕过用户的照片访问权限-如果您的应用程序的照片访问权限被撤销,会发生什么情况? 但是,这可能是许多方法存储照片供以后使用的问题。
  5. 您不控制文件-如果用户将其删除怎么办?

如果您是我,可以使用PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:从照片框架正确检索图像,并将其存储在应用程序目录内的文件中,以适合您正在执行的操作的分辨率用它。 这仍然不会给您带来资产变化,但是是一个很好的解决方案。

如果您想自己存储资产并仅在实际需要它们时才请求图像,那么也许值得研究一下瞬态资产集合 ,尽管我没有使用过它们,因此可能无法满足您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM