Ios 如何确定是否未完全从iCloud下载相位集(因此我需要使用options.networkAccessAllowed再次请求)
文件说: PHImageResultIsInCloudKey: 一个布尔值,指示照片资产数据是存储在本地设备上还是必须从iCloud下载。(国家统计局编号) 如果是,则不提供图像,因为资产数据必须从iCloud下载。要下载数据,请提交另一个请求,并为networkAccessAllowed选项指定YES 但是,当某项资产存储在iCloud照片库中时,即使该资产已完全下载到设备上(在我的应用程序中下载,也在照片应用程序中打开),此密钥始终为“是” 如果图像不可用,我想让用户可以下载它(但不要自动下载,至少在没有Wifi的情况下不会) 那么,如何确定是否需要下载图像 更奇怪的是:当我的结果块Ios 如何确定是否未完全从iCloud下载相位集(因此我需要使用options.networkAccessAllowed再次请求),ios,photokit,phasset,Ios,Photokit,Phasset,文件说: PHImageResultIsInCloudKey: 一个布尔值,指示照片资产数据是存储在本地设备上还是必须从iCloud下载。(国家统计局编号) 如果是,则不提供图像,因为资产数据必须从iCloud下载。要下载数据,请提交另一个请求,并为networkAccessAllowed选项指定YES 但是,当某项资产存储在iCloud照片库中时,即使该资产已完全下载到设备上(在我的应用程序中下载,也在照片应用程序中打开),此密钥始终为“是” 如果图像不可用,我想让用户可以下载它(但不要自动下
requestImageForAsset:targetSize:contentMode:options:resultHandler:
对于需要下载的图像调用,在交付了一个更小且降级的版本之后,我收到了最后一个requestedImage==nil的调用
在这种情况下,降级是没有的,即使我没有得到图像,图像仍然必须从iCloud下载,因为到目前为止,只有照片应用程序中的一个小缩略图在本地可用
我在不同iOS 8版本(8.1.x、8.2 beta、8.3 beta)的iPhone和iPad上测试了这一点,结果总是一样的
在Photos应用程序中打开图像后,结果处理程序的最后一次调用具有完整大小的图像,但PHImageResultIsInCloudKey仍然是YES
以下是我如何请求图像的一些代码:
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.networkAccessAllowed = NO;
[self.imageManager requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *requestedImage, NSDictionary *info) {
// Checking for requestedImage and the info keys here
// When a full sized image was loaded, the result of PHImageResultIsInCloudKey is still YES
// When a full sized image couldn't be loaded cause it's in the cloud, isDegraded is NO and PHImageResultIsInCloudKey is YES (as always) and requestedImage is nil
}];
我可以确认PHImageResultIsInCloudKey不可靠。对于存储在iCloud中的图像,它返回1,即使原始图像已下载到设备上。这种行为与文档相反,我建议在radar.apple.com上报告一个bug。在我看来,PhotoKit仍然是一个非常不成熟的框架-它包含许多问题和一些奇怪的概念性决定。如果调用
requestImageDataForAsset:
,并将允许网络访问设置为否,如果尚未从iCloud下载剪辑,则返回的imageData
将为nil
。否则,它将返回实际数据,即使剪辑存储在iCloud中
PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = NO;
[manager
requestImageDataForAsset:asset
options:options
resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
if ([[info valueForKey:PHImageResultIsInCloudKey] boolValue]) {
// Image is in iCloud
if (imageData) {
// Image is downloaded
} else {
// Image is not downloaded
}
}
}];
您可以使用progressHandler检查PHAsset是否来自iCloud
__block BOOL isPhotoInICloud = NO;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){
isPhotoInICloud = YES;
// some code to update the download progress
});
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.synchronous = NO;
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// use the options to get the high quality image for only once time.
});
检查PHAsset是否仍在云中的最佳方法是尝试通过PHImageManager以networkAccessAllowed=NO访问它,如果您没有获得图像/资产,则您知道它仍在云中(并且不会下载):
以防有人在试图解决iOS 13中的一个bug时偶然发现这个问题
自iOS 8以来,此线程中的方法已被弃用
在iOS 13中,您需要调用此方法:
- (PHImageRequestID)requestImageDataAndOrientationForAsset:(PHAsset *)asset
options:(PHImageRequestOptions *)options
resultHandler:(void (^)(NSData *imageData, NSString *dataUTI, CGImagePropertyOrientation orientation, NSDictionary *info))resultHandler;
感谢您的验证。因此,如果检查“requestedImage==nil”作为需要下载资产的提示似乎是安全的,那么我将进行更多的测试。上面引用的文档说“没有提供图像,因为资产数据必须从iCloud下载”,所以至少这部分是正确的在我看来,文档是正确的,这种行为也是正确的。它为您提供了执行任何操作所需的所有数据:UIImage和信息。如果您已获得图像且图像未降级,则该图像是否在iCloud中对您来说并不重要。可能吧!当它返回1时是正确的,因为图像确实在iCloud中,即使API已经完成下载并以这种方法提供给您。文档中说“如果是,则没有提供图像,因为必须从iCloud下载资产数据。”。因此,如果它提供了一个图像,并且密钥为1,那么文档是错误的……另一个链接可能会有所帮助:我建议我们应该检查优先级上的imageData,如果imageData为零,那么我们应该检查iCloud中的is Images并从iCloud下载图像。
- (PHImageRequestID)requestImageDataAndOrientationForAsset:(PHAsset *)asset
options:(PHImageRequestOptions *)options
resultHandler:(void (^)(NSData *imageData, NSString *dataUTI, CGImagePropertyOrientation orientation, NSDictionary *info))resultHandler;