如何通过Spotlight文件元数据属性/ NSMetadataQuery过滤文件URL的NSArray?

时间:2016-11-30 17:51:18

标签: cocoa nspredicate spotlight nsmetadataquery

NSMetadataQuery类似乎是Finder / Spotlight通过元数据搜索文件的方式。

  

Foundation框架提供的NSMetadataQuery类。查询可以以两种模式运行:异步,与实时更新异步。第一个只是对初始搜索时存在的文件执行搜索。后者继续搜索。将数据更新为满足或不再满足搜索参数更新的文件。

https://developer.apple.com/library/content/documentation/Carbon/Conceptual/SpotlightQuery/Concepts/Introduction.html#//apple_ref/doc/uid/TP40001843-BBCFBCAG

但是,它似乎围绕提供目录(searchScopes),然后异步返回在这些目录中找到的结果(NSMetadataQueryDidFinishGathering)。

我已经有一个包含文件网址的NSArray。我想使用与Spotlight搜索相同的元数据和查询语法构建对这些NSURL的过滤/搜索。但我会提供一个文件列表来快速文件管理器,而不是提供一个目录和接收异步结果。

// Something like this...
let imageFileTypePredicate = NSPredicate(fromMetadataQueryString: "(kMDItemGroupId = 13)")
let imageURLs = allURLs.filter{ imageFileTypePredicate.evaluate(with:$0) };

然而,这是使用标准NSPredicate搜索而不是文件元数据过滤器并且引发错误:

  

此类与密钥_kMDItemGroupId不符合密钥值编码。

此处列出了我对过滤感兴趣的Spotlight元数据属性:
https://developer.apple.com/library/content/documentation/CoreServices/Reference/MetadataAttributesRef/Reference/CommonAttrs.html#//apple_ref/doc/uid/TP40001694-SW1

如何通过Spotlight元数据过滤文件网址数组?

1 个答案:

答案 0 :(得分:0)

为每个网址创建一个MDItem,以获取文件的聚光灯属性。

  

MDItem是一个符合CF的对象,它表示文件和与文件关联的元数据。

https://developer.apple.com/reference/coreservices/1658213-mditem

MDItemRef item = MDItemCreateWithURL(kCFAllocatorDefault, url);
CFArrayRef attributes = MDItemCopyAttributeNames(item);
NSDictionary *attributeValues = CFBridgingRelease(MDItemCopyAttributes(item, attributes));