【发布时间】:2017-08-24 03:46:19
【问题描述】:
我想检索设备上所有本地相册中的所有照片。基本上设备上的所有照片 本地标识符列表是否唯一? 使用照片框架的最佳方法是什么。
我的问题不是重复的,因为另一个问题也涉及云资产和不在设备上的资产。当检索图像的实际数据时,它在尝试获取同步时返回空数据。
【问题讨论】:
-
"设备上的本地相册。基本上设备上的所有照片"相册不能是本地的但包含云中的照片吗?
我想检索设备上所有本地相册中的所有照片。基本上设备上的所有照片 本地标识符列表是否唯一? 使用照片框架的最佳方法是什么。
我的问题不是重复的,因为另一个问题也涉及云资产和不在设备上的资产。当检索图像的实际数据时,它在尝试获取同步时返回空数据。
【问题讨论】:
我想检索所有本地相册中的所有照片 设备。基本上设备上的所有照片
编辑:fetchOptions.includeAssetSourceTypes = .typeUserLibrary见下面的代码
我就是这样做的:
var fetchResult: PHFetchResult<PHAsset>!
...
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.includeAssetSourceTypes = .typeUserLibrary
fetchResult = PHAsset.fetchAssets(with: fetchOptions)
然后,如果我想将其用作 UImage 或缩略图(如果您希望将图像用作数据,请使用 let imageData: NSData = UIImagePNGRepresentation(myImage)),我使用:
/*
* From an asset to a UIImage, also can be used for thumbnail (if you change the :targetSize:)
*/
func getAsset(_ asset: PHAsset) -> UIImage {
//var thumbnail = UIImage()
var imageData = Data()
let options = PHImageRequestOptions()
options.isSynchronous = true
options.deliveryMode = .opportunistic
options.resizeMode = .fast
options.isNetworkAccessAllowed = false
PHImageManager.default().requestImage(for: asset, targetSize: view.frame.size, contentMode: .aspectFill, options: options) { image, info in
//thumbnail = image!
imageData: NSData = UIImagePNGRepresentation(image)
}
//You can check if the UIImage is nil. If it is nil is an iCloud image
//return thumbnail
return imageData
}
您可能会根据需要自定义上述代码或添加更多功能!
以上代码是使用 Swift 3.1 和 Xcode 8.3.1 编写和测试的
根据 Apple 的文档
isNetworkAccessAllowed 一个布尔值,指定照片是否可以从 iCloud 下载请求的图像。 如果为 true,并且请求的图像未存储在本地设备上,则照片会从 iCloud 下载图像。要获得下载进度通知,请使用 progressHandler 属性提供一个块,供照片在下载图像时定期调用。如果为 false(默认值),并且图像不在本地设备上,则结果处理程序的信息字典中的 PHImageResultIsInCloudKey 值指示图像不可用,除非您启用网络访问。
使用 getAsset() 方法从资产中检索图像。它的工作原理
【讨论】:
PHFetchResult *smartAlbums;
smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (NSInteger i =0; i < smartAlbums.count; i++)
{
@autoreleasepool
{
PHAssetCollection *assetCollection = smartAlbums[i];
//Camera Roll
//All Photos //Moments
NSLog(@"assetCollection.localizedTitle---%@",assetCollection.localizedTitle);
// here you will get camera roll photos
if([assetCollection.localizedTitle isEqualToString:@"Camera Roll"] || [assetCollection.localizedTitle isEqualToString:@"All Photos"] )
{
PHFetchOptions *options1 = [[PHFetchOptions alloc] init];
options1.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
options1.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage];
// here you will get all assets of your camera roll images in assetsFetchResult
PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options1];
}
}
}
【讨论】:
第 1 步。
在您的项目中嵌入 Photos.framework
第 2 步
#import <Photos/Photos.h>
第 3 步
在 plist 上添加 NSPhotoLibraryUsageDescription 键
<key>NSPhotoLibraryUsageDescription</key>
<string>${PRODUCT_NAME} PhotoLibrary Usage</string>
第 4 步
编写此代码以获取 PHFetchResult
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *tempAssetsFetchResults = [PHAsset fetchAssetsWithOptions:options];
tempAssetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
【讨论】: