Ios8 为Photokit获取格式化NSPredicate

Ios8 为Photokit获取格式化NSPredicate,ios8,photokit,Ios8,Photokit,我很难理解如何为photokit查询制定文件管理器,特别是当您只想检索某些媒体类型时,如何制定NSPredicate。在我的例子中,我试图检索所有相册(即PHCollectionAssets),尽管我只想要那些相册中的照片。我不知道如何制定我的NSPredicate来做这件事。我在文档中找到了下面的代码,用于过滤某些MediaSubtype,但我只想按PhasetMediaTypeImage mediaType进行过滤。是否有人能够解释下面NSPredicate代码的语法,以及我如何按照@“me

我很难理解如何为photokit查询制定文件管理器,特别是当您只想检索某些媒体类型时,如何制定NSPredicate。在我的例子中,我试图检索所有相册(即PHCollectionAssets),尽管我只想要那些相册中的照片。我不知道如何制定我的NSPredicate来做这件事。我在文档中找到了下面的代码,用于过滤某些MediaSubtype,但我只想按PhasetMediaTypeImage 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];

您给出的示例来自。它通过它们的
mediaSubtype
过滤
PHAssetMediaSubtype
,这是一种枚举类型
PHAssetMediaSubtype
。使用逻辑AND运算符测试资产的
mediaSubtype
是否属于一个或多个可能的子类型。该示例测试从提取返回的相位集是全景照片(
phassetmediasubitephotopanorama
)还是高帧速率视频(
phassetmediasubitevideohighframerate

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

尝试以下方法:

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

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

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

似乎存在细微差别:
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];

谢谢我仍然希望将返回的图像分组并在tableview中显示为“相册”。如果我请求所有图像,我仍然可以这样做吗?您可以使用[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum…获取相册,然后使用[PhasSetFetchAssetAssetCollection:…]将资产集合作为参数来获取资产。请参阅