如何使用NSPredicate和PHFetchOptions对媒体子类型进行过滤?我试图排除慢视频(高帧速率)和时间推移视频。当我尝试使用predicate字段PHFetchOptions时,我总是得到奇怪的结果。
我的手机有一堆(120+)常规视频,还有一段慢视频。当我从苹果的文档运行这个示例时,我会得到正确的结果:1慢速mo视频。
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'有没有人能用这个谓词作正面或反面判断?
发布于 2016-09-08 12:16:24
首先,让我谈谈s in mediaSubtypes在PHAsset上可用,只有苹果的Photos团队知道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
}在您的例子中,谓词应该是-
这在我的情况下效果很好。希望它能帮到别人。
https://stackoverflow.com/questions/31528441
复制相似问题