格式化NSPredicate以获取Photokit

use*_*120 3 ios8 photokit

我在理解如何为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];
Run Code Online (Sandbox Code Playgroud)

Art*_*hur 5

似乎有一个细微的差别:PHAssetMediaSubtype是位掩码值,而PHAssetMediaType仅仅是一个整数。它并没有真正改变它们的性质,但是也许谓词解释器只是拒绝将按位AND运算符&应用于PHAssetMediaType。为此,您需要使用常规的等于运算符==

因此,如果fetchAssetsWithMediaType因为您只想要给定集合中的资产而没有任何fetchAssetsInAssetCollection:withMediaType:方法对您来说不够好,则可以执行以下操作:

PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.predicate = 
    [NSPredicate predicateWithFormat:@"mediaType == %d", PHAssetMediaTypeImage];
PHFetchResult *assetsFetchResult = 
    [PHAsset fetchAssetsInAssetCollection:anAssetCollection options:fetchOptions];
Run Code Online (Sandbox Code Playgroud)