2016-02-05 181 views
5

以下谓词应该只提取所有屏幕截图,这很好。PHFetchOptions mediaSubtype谓词

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

但是如果我只尝试使用follwing谓词排除截图,所有的图像被排除

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

所有进出口试图做的是从exlude资产screeshots取。

这是已知的错误还是我错过了什么?

+1

可能重复:[NSPredicate以排除PHFetchResults慢动作视频](http://stackoverflow.com/questions/31939082/)(相同的一般问题,只是一个不同的'PHAssetMediaSubtype'值)。尝试修复? – rickster

+0

谢谢你的评论,不幸的是,即使答案被标记为正确,它实际上并没有工作。 – stringCode

回答

3

我做了一个快速检查,这似乎为我工作:

PHFetchOptions *options = [[PHFetchOptions alloc] init]; 
options.predicate = [NSPredicate predicateWithFormat:@"(mediaSubtype & %d) == 0", PHAssetMediaSubtypePhotoScreenshot]; 

注意如何在谓语双等于做比较,而不是单一的一个。

+0

谢谢你的回复。我现在再试一次。这将删除屏幕截图,但大多数常规照片也是如此:-)具体的子类型为PHAssetMediaSubtypeNone。 – stringCode

+2

这不应该发生,但实际上确实如此。我做了一些实验,看起来像过滤是一个小错误。使用谓词来检查其他子类型的组合也不起作用,这甚至是Apple推荐的文档方式。一旦这么说我认为目前处理这个问题的最好方法是获取完整集合并通过枚举手动过滤数组,尽管如果您需要实时更新获取,那么在这种情况下您将看起来很失望。 –

+0

是的,在这一点上,我得出了同样的结论,我希望我做了一些愚蠢的事情,但它似乎是苹果的错误。将填补雷达。感谢您的帮助和时间 – stringCode

1

了几个小时后,我找到了一个解决方法使用NOT操作:

NSPredicate(format: "NOT ((mediaSubtype & %d) != 0)", PHAssetMediaSubtype.PhotoScreenshot.rawValue)