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

时间:2016-02-23 07:12:54

标签: ios iphone photos alassetslibrary phasset

我曾经使用ALAssetLibrary。并且它具有assetForURL功能,因此我可以将网址保存到NSUserDefaults并在应用重新启动后通过网址检索ALasset

然而,当我改为PHAsset时,我无法找到这种功能。我发现的是fetchAssetsWithALAssetURLs,但ALasset会弃用它,所以我不倾向于使用此功能。 (保存ALAsset网址,并从fetchAssetsWithALAssetURLs

检索PHAsset

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

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

2 个答案:

答案 0 :(得分:10)

关键是属性.localIdentifier。它是“模糊的”,因为它实际上是超类PHObject的属性。以下是文档的说法:

  

持久标识对象的唯一字符串。 (只读)

     

声明

     

SWIFT

     

var localIdentifier: String { get }

     

讨论

     

使用此字符串通过使用来查找对象   fetchAssetsWithLocalIdentifiers:options:,   fetchAssetCollectionsWithLocalIdentifiers:options:,或   fetchCollectionListsWithLocalIdentifiers:options:方法。

答案 1 :(得分:5)

您无需在 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;
          }
      }];
   }
 }];