如何限制从NSMetadataQuery返回的结果的数量?



是否有办法限制从macOS上的NSMetadataQuery查询返回的文件搜索结果的最大数量?目前,如果我输入1-2个字符作为查询字符串,接收到初始结果集需要5秒以上的时间,结果计数约为100k-300k,而我只需要前50个结果。如果我的查询字符串长度为5+字符,查询时间将减少到几毫秒。

我用MDQuery尝试了同样的方法,并且能够限制最大值。使用MDQuerySetMaxCount的结果为50,所以我想知道NSMetadataQuery是否有类似的情况?我看到Alfred和类似的应用程序几乎在每次击键后立即返回前20-40个结果。

到目前为止我写的是:

class MDQSearch {
var metadataQuery = NSMetadataQuery()

init() {
registerNotifications()
metadataQuery.searchScopes = [NSString("~/Documents").expandingTildeInPath]
}

func updateQuery(to queryString: String) {
guard queryString.count > 0 else { return }

metadataQuery.predicate = NSPredicate(format: "%K CONTAINS[cd] %@", argumentArray: [NSMetadataItemFSNameKey, queryString])
metadataQuery.start()
}

func registerNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidFinishGathering), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryGatheringProgress), name: NSNotification.Name.NSMetadataQueryGatheringProgress, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidUpdate), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: metadataQuery)
}

@objc func onQueryDidUpdate() {
print("QueryDidUpdate")
}

@objc func onQueryDidFinishGathering() {
print("QueryDidFinishGathering")
metadataQuery.stop()

print("result count: (metadataQuery.resultCount)")
}

@objc func onQueryGatheringProgress() {
print("QueryGatheringProgress")

if(metadataQuery.resultCount >= 50) {
metadataQuery.stop()

print("result count: (metadataQuery.resultCount)")
}
}
}

我建议问题是你使用NSMetadataItemFSNameKey。这很慢,因为必须查询文件系统。使用显示名称键代替;这是由重点报道索引的信息,所以速度很快。

相关内容

  • 没有找到相关文章

最新更新