网络上找了很久,基本都是这个方法
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
[[PHImageManager defaultManager] requestImageForAsset:self.phAsset targetSize:CGSizeMake(50, 50) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
if ([[info objectForKey:PHImageResultIsInCloudKey] boolValue]) {
}
}];
但是我试了很多次,调整了很多options参数,就是不返回 PHImageResultIsInCloudKey 这个key,搜寻良久 发现只有尝试去请求高保真图 PHImageManagerMaximumSize的时候,它才会返PHImageResultIsInCloudKey这个key,但是我这个方法本来只想展示50x50的小图,也就是说我需要另外一个专门判断是否在icloud的方法
于是尝试特意加了一个方法判断,能找到就是在本地,不然就是在icloud上
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.networkAccessAllowed = NO;
options.synchronous = YES;
[[PHImageManager defaultManager] requestImageForAsset:self.phAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
//如果能获取到 result 就是本地的图,不然就在icloud
}];
但是这个方法极其损耗性能,对于相册里的几百上千照片,统一一次加载会卡顿,一个个去取,异步请求也会导致 一卡一卡,体验很差。
后来在stackoverflow.com 上找到一个方法,非常喜悦,这个方法解决了性能问题
NSArray *resourceArray = [PHAssetResource assetResourcesForAsset:rescource.phAsset];
bIsLocallayAvailable = [[resourceArray.firstObject valueForKey:@"locallyAvailable"] boolValue];
but! 在iOS10以下无效 呵呵
后来发现了另外一个请求图片的方法requestImageDataForAsset
[[PHImageManager defaultManager] requestImageDataForAsset:rescource.phAsset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
if ([[info objectForKey:PHImageResultIsInCloudKey] boolValue]) {
}
}];
这个方法在iOS8以上的系统都支持,并且性能还可以,不会造成卡顿,OK,解决!
网友评论