首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查给定的PHAsset是否为iCloud资产?

检查给定的PHAsset是否为iCloud资产?
EN

Stack Overflow用户
提问于 2015-08-12 21:25:04
回答 6查看 15.1K关注 0票数 19

我正在尝试获取PhAsset对象。我想隔离iCloud资产。这是我的代码,

代码语言:javascript
复制
PHFetchResult *cloudAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

[cloudAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop){
    if(collection != nil){

        PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
        [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop)
         {
            // check asset is iCloud asset 

         }];
    }

}];

请告诉我如何查找PHAsset is iCloud资产?

EN

回答 6

Stack Overflow用户

发布于 2017-09-24 20:17:36

这有点像黑客,我必须挖掘出资源数组并进行调试才能找到所需的信息。但它是有效的。虽然这是一个没有文档记录的代码,我也不确定苹果是否会因为这个原因而拒绝这款应用。试一试,看看会发生什么!

代码语言:javascript
复制
// asset is a PHAsset object for which you want to get the information    
NSArray *resourceArray = [PHAssetResource assetResourcesForAsset:asset];
BOOL bIsLocallayAvailable = [[resourceArray.firstObject valueForKey:@"locallyAvailable"] boolValue]; // If this returns NO, then the asset is in iCloud and not saved locally yet

您还可以从资产资源中获取一些其他有用的信息,如原始文件名、文件大小、文件url等。

票数 23
EN

Stack Overflow用户

发布于 2016-11-01 11:22:03

实际有两种情况: 1、该设备抓拍到照片,并上传到iCloud。然后,您可以使用progressHandler检查是否需要下载iCloud。

代码语言:javascript
复制
__block BOOL isPhotoInICloud = NO;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){

        isPhotoInICloud = YES;

});

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

        if (isPhotoInICloud) {
            // Photo is in iCloud.
        }
});

  1. 照片是iCloud格式的,但从其他设备上传。而且你也没有把它保存到你的本地图片库。因此progressHandler块永远不会被调用。我不知道为什么,但这是真的,我认为这是PhotoKit框架的一种错误。对于这种情况,如果您使用PHImageResultIsInCloudKey,这也很困难。因为只需在requestImageForAsset的resultHandler块中就可以知道PHImageResultIsInCloudKey的值。但这是在发起照片请求之后的时间。

因此,至少在我看来,没有办法检查照片是否存储在iCloud中。也许还有其他更好的方法,请让我知道。非常感谢!

票数 12
EN

Stack Overflow用户

发布于 2015-08-13 10:32:57

当你请求一张图片时,你会在info字典中得到一个键,它会告诉你资产是否存在于iCloud中。

代码语言:javascript
复制
[cloudAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop)
{
    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
    [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop)
    {  
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.resizeMode = PHImageRequestOptionsResizeModeFast;
        options.synchronous = YES;
        __block BOOL isICloudAsset = NO;
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage *result, NSDictionary *info) 
        {
            if ([info objectForKey: PHImageResultIsInCloudKey].boolValue) 
            {
                isICloudAsset = YES;
            }
        }]; 
    }];
}];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31966571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档