3

我在理解如何为 photokit 查询制定文件管理器时遇到了很多麻烦,特别是当您只想检索某些 mediaTypes 时如何制定 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];
4

2 回答 2

5

似乎有一个微妙的区别: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];
于 2014-10-05T20:55:52.407 回答
0

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

如果您只想获取图像,则需要这样做。获取图像。不要获取所有资产并按 过滤mediaSubtype,因为这是不必要的。

试试方法:

 + (PHFetchResult *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(PHFetchOptions *)options;

像这样:

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

这将返回所有图像。(可选)传递PHFetchOptions以进一步过滤此 fetch 返回的图像。

于 2014-09-30T22:12:12.287 回答