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;
}
}];
}
}];
我以前用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:
, orfetchCollectionListsWithLocalIdentifiers: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;
}
}];
}
}];