Nspredicate 如何筛选NSMetadataQuery

Nspredicate 如何筛选NSMetadataQuery,nspredicate,nsmetadataquery,icloud-drive,Nspredicate,Nsmetadataquery,Icloud Drive,我正在尝试使用谓词创建一个NSMetadataQuery。在某一点上,我可能想收集iCloud的所有视频,在另一点上,我可能会收集所有图像。我不想要任何其他东西,只是搜索视频或图像。不是两个都在同一时间 我创建了以下代码: CFStringRef whatToFilter = kUTTypeImage; if (self.filterType == kKindVideo) { whatToFilter = kUTTypeVideo; } NSPredicate *predType =

我正在尝试使用谓词创建一个
NSMetadataQuery
。在某一点上,我可能想收集iCloud的所有视频,在另一点上,我可能会收集所有图像。我不想要任何其他东西,只是搜索视频或图像。不是两个都在同一时间

我创建了以下代码:

CFStringRef whatToFilter = kUTTypeImage;
if (self.filterType == kKindVideo) {
    whatToFilter = kUTTypeVideo;
}

NSPredicate *predType = [NSPredicate predicateWithFormat:@"(%K == %@)", NSMetadataItemContentTypeKey, whatToFilter];

NSMetadataQuery *newQuery = [[NSMetadataQuery alloc] init];
[newQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];
newQuery.predicate = predType;
只要我将这个谓词添加到
newQuery
中,它就会给出零结果


此查询的正确语法是什么?不要告诉我谓词对
NSMetadataQuery
也不起作用,因为排序也不起作用。

创建正确的
NSMetadataQuery
谓词的最佳方法是使用查找器的查询表达式编辑器,如下所示:

然后将其另存为智能文件夹,并在生成的文件夹上获取信息:

在本例中,相关的Spotlight查询语法是:
“(kMDItemUserTags=='Assets'cd)”
。。。(忽略
\u kMDItemGroupId
子表达式,因为以下划线开头的属性名称不是公共API。)

最后,让
NSPredicate
了解它希望如何重写查询字符串:

let predicate = NSPredicate(fromMetadataQueryString: "(kMDItemUserTags == 'Assets'cd)")
NSPredicate(来自MetadataQueryString:
是一个很好的发现。