我在理解如何为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];
答案 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}}以进一步过滤此提取返回的图像。