【问题标题】:Formatting NSPredicate for Photokit Fetch为 Photokit Fetch 格式化 NSPredicate
【发布时间】:2014-09-30 20:40:31
【问题描述】:

我很难理解如何为 photokit 查询制定文件管理器,特别是当您只想检索某些媒体类型时如何制定 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];

【问题讨论】:

    标签: ios8 photokit


    【解决方案1】:

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

    所以,如果 fetchAssetsWithMediaType 对您来说不够好,因为您只想要给定集合中的资产并且没有 fetchAssetsInAssetCollection:withMediaType: 方法,您可以这样做:

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

    【讨论】:

      【解决方案2】:

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

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

      试试方法:

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

      像这样:

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

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

      【讨论】:

      • 谢谢。我仍然想在表格视图中将返回的图像分组并呈现为“相册”。如果我请求所有图片,我还能这样做吗?
      • 您可以使用 [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum... 获取相册,然后使用 [PHAsset fetchAssetsInAssetCollection:...] 获取资产,并将资产集合作为参数。见developer.apple.com/library/ios/documentation/Photos/Reference/…
      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多