如何在Swift(NSMetadataQuery)中进行聚光灯搜索



我正试图在mac应用程序中进行聚光灯搜索。这是我迄今为止的代码:

import Foundation
let nf = NotificationCenter.default
class FileSearcher {
public static let sharedInstance = FileSearcher()

var query: NSMetadataQuery? {
willSet {
if let q = self.query {
q.stop()
}
}
}
init() {
print("Setting observer")
nf.addObserver(forName: .NSMetadataQueryDidStartGathering, object: nil, queue: .main, using: {_ in
print("Query did start gathering")
})
nf.addObserver(forName: .NSMetadataQueryDidUpdate, object: nil, queue: .main, using: {_ in
print("QUery results updated (self.query?.resultCount)")
})
nf.addObserver(forName: .NSMetadataQueryDidFinishGathering, object: nil, queue: .main, using: {_ in
print("Got results (self.query?.results)")
})
}

func searchFile(_ oq: String) {
print("Searching (oq)")
query = NSMetadataQuery()
let predicate = NSPredicate(format: "%K ==[cd] %@", NSMetadataItemFSNameKey ,oq)
query?.searchScopes = [NSMetadataQueryIndexedLocalComputerScope]
query?.predicate = predicate
query?.start()
}
}

问题是查询did update和查询did finish collection从未被触发。也许它与我的谓词有关?我正在尝试进行模糊搜索。

非常感谢您的帮助!

发现了这个问题,在我看到的任何Stack Overflow答案中都没有提到,显然它在某个地方被记录了下来。您需要从主调度队列调用它:

func searchFile(_ oq: String) {
if(!oq.isEmpty) {
query = NSMetadataQuery()
let predicate = NSPredicate(format: "%K ==[cd] %@", NSMetadataItemFSNameKey, oq)
query?.searchScopes = [NSMetadataQueryIndexedLocalComputerScope]
query?.predicate = predicate
DispatchQueue.main.async {
self.query?.start()
}
}
}

最新更新