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

有反正我可以使用从"PHImageFileURLKey"返回的path进入照片库和检索图像?

返回的path是这种格式:

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

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

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

我认为你从URL中检索Photo Kit资源的解决scheme是错误的。

这是我会做的(假设你有访问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”,则忽略此答案。

这是没有logging,所以我强烈build议不要使用该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的stringreplace为适用于您手机的string。

这样做可能会带来很多问题 – 这不仅仅是框架的使用方式。 这里有一些我的头顶:

  1. 在模拟器中运行时,根path会在启动应用程序之间定期更改,所以如果您以这种方式存储absoluteUrls,数据库将快速充满死链接。 这至less可以说是不方便的。
  2. 更糟糕的是,这些图片的URL可能会在真实的设备上发生变化 – 您无法控制它,一旦它们发生变化,就是您的应用程序的错误,让用户重新select它们。
  3. 你不会发现照片来自PHAsset变化。
  4. 这可能会绕过用户访问照片的权限 – 如果您的应用访问照片的权限被撤销会发生什么情况? 然而,这可能是存储照片以供以后使用的很多方法的问题。
  5. 您不控制该文件 – 如果用户删除它,该怎么办?

如果我是你,我会使用PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:来正确地从照片框架中检索图片,并将其存储在应用程序目录中的一个文件中,以一个合理的解决scheme,无论你在做什么用它。 这仍然不会给你资产的变化,但是一个很好的解决scheme。

如果你想存储资产本身,只在实际需要的时候请求图片,可能是值得研究的短暂资产集合 ,尽pipe我没有使用它们,因此可能无法满足你的需要。