为Photokit Fetch格式化NSPredicate

时间:2014-09-30 20:40:32

标签: ios8 photokit

我在理解如何为photokit查询制定文件管理器方面遇到了很多麻烦,特别是当你只想检索某些mediaType时如何制定NSPredicate。就我而言,我正在尝试检索所有专辑(即PHCollectionAssets),尽管我只想要这些专辑中的照片。我很困惑如何制定我的NSPredicate来做到这一点。我在文档中找到了过滤某些mediaSubtypes的代码,但我只是想通过PHAssetMediaTypeImage mediaType进行过滤。有人能够解释下面的NSPredicate代码的语法,以及我如何设置一个@"mediaType == %@, PHAssetMediaTypeImage"的谓词,这不会导致我的PHFetchRequest崩溃,就像现在一样?

PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.predicate = 
    [NSPredicate predicateWithFormat:
        @"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0", 
        PHAssetMediaSubtypePhotoPanorama, PHAssetMediaSubtypeVideoHighFrameRate];
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions];

2 个答案:

答案 0 :(得分:4)

似乎有一个微妙的区别:PHAssetMediaSubtype是一个掩码值,而PHAssetMediaType只是一个int。它并没有真正改变它们的性质,但是谓词解释器可能只是拒绝将按位AND运算符&应用于PHAssetMediaType。对于那个,您需要使用常规等于运算符==

因此,如果fetchAssetsWithMediaType对您不够好,因为您只想要给定集合中的资源且没有fetchAssetsInAssetCollection:withMediaType:方法,那么您可以这样做:

PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.predicate = 
    [NSPredicate predicateWithFormat:@"mediaType == %d", PHAssetMediaTypeImage];
PHFetchResult *assetsFetchResult = 
    [PHAsset fetchAssetsInAssetCollection:anAssetCollection options:fetchOptions];

答案 1 :(得分:0)

您提供的示例来自docs。它正在PHAssets过滤mediaSubtype PHAssetMediaSubtype,其类型为mediaSubtype,即枚举。您使用逻辑AND运算符来测试资产的PHAssetMediaSubtypePhotoPanorama是否属于一个或多个可能的子类型。该示例测试从提取返回的PHAsset是全景照片(PHAssetMediaSubtypeVideoHighFrameRate)还是高帧率视频(mediaSubtype)。

如果您只想获取图片,则需要这样做。获取图像。不要获取所有资产并按 + (PHFetchResult *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(PHFetchOptions *)options; 过滤,因为这是不必要的。

尝试方法:

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
像这样:

PHFetchOptions

这将返回所有图像。 (可选)传递{{1}}以进一步过滤此提取返回的图像