PHAsset,如何在应用重启后检索特定的 PHAsset 对象(ios8 图片)

PHAsset, how to retrieve the specific PHAsset object after app restarts (ios8 Photos)

我以前用ALAssetLibrary。并且它有assetForURL功能,这样我就可以把URL保存到NSUserDefaults中,并且在应用程序重启后通过URL检索ALasset

但是,当我改成PHAsset时,我找不到这种功能。我找到的是 fetchAssetsWithALAssetURLs,但它会因 ALasset 而被弃用,所以我不倾向于使用这个功能。 (保存 ALAsset url ,并从 fetchAssetsWithALAssetURLs 检索 PHAsset)

我认为这是使用密钥 "localIdentifier" 将整个 PHAsset 对象保存到 NSUserDefaults 中的唯一方法,因此我可以在应用程序重新启动后重新加载它。检索 phasset 对象是通过键 localIdentifier.

这是实现我目标的好方法吗?其他方式 ?

关键是属性.localIdentifier。它是 "obscure" 因为它实际上是超级 class PHObject 的 属性。文档是这样说的:

A unique string that persistently identifies the object. (read-only)

Declaration

SWIFT

var localIdentifier: String { get }

Discussion

Use this string to find the object by using the fetchAssetsWithLocalIdentifiers:options:, fetchAssetCollectionsWithLocalIdentifiers:options:, or fetchCollectionListsWithLocalIdentifiers:options: method.

您不需要在 NSUserDefaults 中设置整个 PHAsset 对象。 只需在 NSUserDefaults 中为 "photoIdentifier".

之类的任意键设置 localIdentifier

那么假设您有一个 PHAsset 对象

使用下面的方法保存 localIdentifier。

PHAsset *assetObject;

[[NSUserDefaults standardUserDefaults] setObject:assetObject.localIdentifier forKey:@"PhotoIdentifier"];

现在要检索该资产,您需要遍历照片集并通过其标识符获取准确的照片。

PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];

[allPhotos enumerateObjectsUsingBlock:^(PHAsset   * _Nonnull photoAsset, NSUInteger idx, BOOL * _Nonnull stop) {

 NSString *photoIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"PhotoIdentifier"];
 if([photoIdentifier isEqualToString:photoAsset.localIdentifier]){

     // asset here

    // if you want Image then get UIImage from PHAsset as follows.           

     [[PHImageManager defaultManager]requestImageForAsset:photoAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage *result, NSDictionary *info){
          if ([info objectForKey:PHImageErrorKey] == nil && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue]) {

             // image is here as a result parameter
             *stop = YES;
          }
      }];
   }
 }];