我正在尝试获取PhAsset对象。我想隔离iCloud资源。这是我的代码,
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是iCloud资产?
7条答案
按热度按时间flvtvl501#
这有点像黑客,我不得不挖掘资源数组并调试以找到我需要的信息。但它工作。虽然这是一个未记录的代码,我不确定苹果是否会因此拒绝应用程序。给予它一个尝试,看看会发生什么!
您还可以从资产资源中获得一些其他有用的信息,如原始文件名、文件大小、文件URL等。
nnsrf1az2#
实际上有两种情况:1.照片由本设备拍摄,并上传到iCloud,然后您可以使用progressHandler检查是否需要iCloud下载。
1.照片在iCloud中,但从其他设备上传。并且您没有将其保存到本地照片库。因此progressHandler块永远不会被调用。我不知道为什么,但这是真的,我认为这是PhotoKit框架的一个bug。对于这种情况,如果您使用PHImageResultIsInCloudKey,这也很困难,因为你可以在requestImageForAsset的resultHandler块中知道PHImageResultIsInCloudKey的值,但那是照片请求启动后的时间。
所以,至少,在我看来,没有办法检查照片是否存储在iCloud。也许有其他更好的方法,请让我知道。非常感谢!
db2dz4w83#
当你请求一张图片时,你会在信息字典中得到一个关键字,它会告诉你该资产是否存在于iCloud中。
gkn4icbw4#
这是Swift 3的版本
8aqjt8rx5#
以下是您可以实现的获取“照片”应用的“视频”文件夹中所有视频的方法,该方法使用PHFetchRequest predicate 仅过滤存储在iPhone本身上的视频,而不是存储在iCloud中的视频:
Apple关于PHFetchResult的文档指出,只有属性的子集可以与 predicate 一起使用;因此,如果上面的代码不适合您,请删除PHFetchOptions predicate ,并将PHFetchRequest中的相应引用替换为nil:
然后,添加以下行:
gywdnpxw6#
这段代码应该可以工作。2如果经常调用这段代码,请确保通过PHImageRequestID取消无用的请求。
hmmo2u0o7#
这是Swift 5版本