Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何确定是否未完全从iCloud下载相位集(因此我需要使用options.networkAccessAllowed再次请求)_Ios_Photokit_Phasset - Fatal编程技术网

Ios 如何确定是否未完全从iCloud下载相位集(因此我需要使用options.networkAccessAllowed再次请求)

Ios 如何确定是否未完全从iCloud下载相位集(因此我需要使用options.networkAccessAllowed再次请求),ios,photokit,phasset,Ios,Photokit,Phasset,文件说: PHImageResultIsInCloudKey: 一个布尔值,指示照片资产数据是存储在本地设备上还是必须从iCloud下载。(国家统计局编号) 如果是,则不提供图像,因为资产数据必须从iCloud下载。要下载数据,请提交另一个请求,并为networkAccessAllowed选项指定YES 但是,当某项资产存储在iCloud照片库中时,即使该资产已完全下载到设备上(在我的应用程序中下载,也在照片应用程序中打开),此密钥始终为“是” 如果图像不可用,我想让用户可以下载它(但不要自动下

文件说:

PHImageResultIsInCloudKey: 一个布尔值,指示照片资产数据是存储在本地设备上还是必须从iCloud下载。(国家统计局编号) 如果是,则不提供图像,因为资产数据必须从iCloud下载。要下载数据,请提交另一个请求,并为networkAccessAllowed选项指定YES

但是,当某项资产存储在iCloud照片库中时,即使该资产已完全下载到设备上(在我的应用程序中下载,也在照片应用程序中打开),此密钥始终为“是”

如果图像不可用,我想让用户可以下载它(但不要自动下载,至少在没有Wifi的情况下不会)

那么,如何确定是否需要下载图像

更奇怪的是:当我的结果块
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;