NSMetadataQuery
类似乎是Finder / Spotlight通过元数据搜索文件的方式。
Foundation框架提供的NSMetadataQuery类。查询可以以两种模式运行:异步,与实时更新异步。第一个只是对初始搜索时存在的文件执行搜索。后者继续搜索。将数据更新为满足或不再满足搜索参数更新的文件。
但是,它似乎围绕提供目录(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元数据过滤文件网址数组?
答案 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));