如何过滤NSMetadataQuery

时间:2016-01-27 10:41:57

标签: nspredicate nsmetadataquery icloud-drive

我正在尝试使用谓词创建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,因为排序也不起作用。

1 个答案:

答案 0 :(得分:4)

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

Smart Folder query expression editor

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

Smart Folder info

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

最后,让NSPredicate弄清楚如何重写查询字符串:

let predicate = NSPredicate(fromMetadataQueryString: "(kMDItemUserTags == 'Assets'cd)")