【问题标题】:How to to filter by media subtype using NSPredicate with PHFetchOptions如何使用带有 PHFetchOptions 的 NSPredicate 按媒体子类型进行过滤
【发布时间】:2015-10-10 06:44:17
【问题描述】:

如何使用NSPredicatePHFetchOptions 按媒体子类型进行过滤? 我试图排除慢动作(高帧率)和延时视频。当我尝试使用PHFetchOptionspredicate 字段时,我不断得到奇怪的结果。

我的手机有一堆(120 多个)常规视频和一个慢动作视频。当我从Apple's docs 运行示例时,我得到了正确的结果:1 个慢动作视频。

PHFetchOptions *options = [PHFetchOptions new];
options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0", PHAssetMediaSubtypeVideoTimelapse, PHAssetMediaSubtypeVideoHighFrameRate];

但我试图排除慢动作,而不是选择它。但是,如果我否定过滤条件,我会得到零结果:

options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) == 0", PHAssetMediaSubtypeVideoHighFrameRate];

<PHFetchResult: 0x1702a6660> count=0

令人困惑的是,Apple 文档将该字段的名称列为mediaSubtypes(带有“s”),而他们的示例谓词是过滤mediaSubtype(没有“s”)。

尝试过滤 mediaSubtypes 会产生错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do bit operators on non-numbers'

有没有人能够对这个谓词做出正面或反面?

【问题讨论】:

  • 加一。我们也遇到过类似的问题。还没有修复。

标签: ios objective-c cocoa-touch nspredicate photosframework


【解决方案1】:

首先,让我谈谈mediaSubtypes 中的s PHAsset 可用,只有Apple 的照片团队知道mediaSubtype 在没有s 的情况下为什么以及如何工作。

@property (nonatomic, assign, readonly) PHAssetMediaType mediaType;
@property (nonatomic, assign, readonly) PHAssetMediaSubtype mediaSubtypes;

现在让我试着解释一下为什么它不能按预期工作。以下是使用 NS_OPTIONS 或任何其他按位运算进行比较的方法。

PHAsset* asset = // my asset;
if((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot) {
    // This is a screenshot
}

您可以通过以下方式比较资产是否不是屏幕截图-

PHAsset* asset = // my asset;
if(!((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot)) {
// This is not a screenshot
}

现在在你的情况下,谓词应该是-

  • 获取所有高帧率视频

    [NSPredicate predicateWithFormat:@"((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate];
    
  • 获取所有没有高帧率的视频

    [NSPredicate predicateWithFormat:@"!((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate];
    

这对我来说效果很好。希望它可以帮助其他人。

【讨论】:

  • 一百万年后我永远也想不通。
  • 这太棒了! FWIW,这似乎已在 iOS 13 中修复!
猜你喜欢
  • 2016-01-25
  • 2012-04-16
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多