首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用NSPredicate和PHFetchOptions对媒体子类型进行过滤

如何利用NSPredicate和PHFetchOptions对媒体子类型进行过滤
EN

Stack Overflow用户
提问于 2015-07-21 00:23:06
回答 1查看 2.7K关注 0票数 13

如何使用NSPredicatePHFetchOptions对媒体子类型进行过滤?我试图排除慢视频(高帧速率)和时间推移视频。当我尝试使用predicate字段PHFetchOptions时,我总是得到奇怪的结果。

我的手机有一堆(120+)常规视频,还有一段慢视频。当我从苹果的文档运行这个示例时,我会得到正确的结果:1慢速mo视频。

代码语言:javascript
复制
PHFetchOptions *options = [PHFetchOptions new];
options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0", PHAssetMediaSubtypeVideoTimelapse, PHAssetMediaSubtypeVideoHighFrameRate];

但我试图排除慢莫,而不是选择它。但是,如果我否定筛选条件,则返回零结果:

代码语言:javascript
复制
options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) == 0", PHAssetMediaSubtypeVideoHighFrameRate];

<PHFetchResult: 0x1702a6660> count=0

令人困惑的是,Apple将字段的名称列为mediaSubtypes (带有"s"),而它们的示例谓词则在mediaSubtype上过滤(没有"s")。

试图对mediaSubtypes进行筛选会产生一个错误:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do bit operators on non-numbers'

有没有人能用这个谓词作正面或反面判断?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-08 12:16:24

首先,让我谈谈s in mediaSubtypesPHAsset上可用,只有苹果的Photos团队知道mediaSubtype为什么和如何工作没有s

代码语言:javascript
复制
@property (nonatomic, assign, readonly) PHAssetMediaType mediaType;
@property (nonatomic, assign, readonly) PHAssetMediaSubtype mediaSubtypes;

现在让我解释一下为什么它不能像预期的那样工作。下面是使用NS_OPTIONS或任何其他按位操作进行比较的方法。

代码语言:javascript
复制
PHAsset* asset = // my asset;
if((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot) {
    // This is a screenshot
}

下面是你比较资产是不是一个截图的方法-

代码语言:javascript
复制
PHAsset* asset = // my asset;
if(!((asset.mediaSubtypes & PHAssetMediaSubtypePhotoScreenshot) == PHAssetMediaSubtypePhotoScreenshot)) {
// This is not a screenshot
}

在您的例子中,谓词应该是-

  • 获取所有高帧速率的视频 NSPredicate谓词NSPredicate:@“((mediaSubtype& %d) == %d)",PHAssetMediaSubtypeVideoHighFrameRate,PHAssetMediaSubtypeVideoHighFrameRate;
  • 在没有高帧速率的情况下获取所有视频 NSPredicate谓词NSPredicate:@“((mediaSubtype& %d) == %d)",PHAssetMediaSubtypeVideoHighFrameRate,PHAssetMediaSubtypeVideoHighFrameRate;

这在我的情况下效果很好。希望它能帮到别人。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31528441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档