无法获得使用NSMetadataQuery和Kmditemusertags的搜索结果搜索的结果



我在尝试向控制器添加例程以搜索用户的计算机以查找具有指定用户(mavericks )标签的用户文件后,处于我的智慧。我遇到了搜索启动的块,但是没有返回结果,并且dubist queue为零。

这是代码:

class myController: NSWindowController {
    //define metadataQuery 
    var metadataQuery: NSMetadataQuery!
    var metadataQueryDidUpdateObserver: AnyObject?
    var metadataQueryDidFinishGatheringObserver: AnyObject?
    //initialize notificationsCenter
    let notificationsCenter = NotificationCenter.default
func doSpotlightSearch(){
    //add observers
    notificationsCenter.addObserver(self, selector: "initalGatherComplete:", name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)
    notificationsCenter.addObserver(self, selector: "batchReturned:", name: NSNotification.Name.NSMetadataQueryDidUpdate, object: nil)

    metadataQuery = NSMetadataQuery()
    metadataQuery.searchScopes = [NSMetadataQueryIndexedLocalComputerScope]
    metadataQuery.predicate = NSPredicate(format: "kMDItemUserTags == 'myTags.testTag'")
    //start search
    metadataQuery.start()
    //test to see if query is up and running
    while metadataQuery.isGathering{
        print(metadataQuery.operationQueue?.operationCount)
        print ("result count: (metadataQuery.resultCount)")
        sleep(1)
    }
func batchReturned(_ sender: NSNotification) {
    print("Running batchReturned func")
    let resultCounter = metadataQuery.resultCount
    print("Number of results:(resultCounter)")
    let notificationsCenter = NotificationCenter.default
    notificationsCenter.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)
}
func initalGatherComplete(_ sender: NSNotification) {
    print("Running initialGatherComplete func")
    metadataQuery.stop()
    let resultCounter = metadataQuery.resultCount
    print("Number of results:(resultCounter)")
    let notificationsCenter = NotificationCenter.default
    notificationsCenter.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)
}

当我运行上述代码时,它将结果队列显示为零,结果算为零。即使我拿出了iSgather循环,批量的和初始的complete函数也永远不会被调用。

我怀疑谓词格式可能存在问题,但是当我将查询放入终端时,这很好。

NSMetadataQuery.start()方法的文档: This method must be called from the receiver’s operationQueue or on the main thread.

如果您不从主线程调用start()方法,则负责自己创建OperationQueue并从那里开始,例如:

// Declare on class-level
private lazy var queryOperationQueue: OperationQueue = {
  let queue = OperationQueue()
  queue.maxConcurrentOperationCount = 1 // restriction for NSMetadataQuery
  return queue
}()

...
func doSpotlightSearch() {
  metadataQuery = NSMetadataQuery()
  metadataQuery.searchScopes = [NSMetadataQueryIndexedLocalComputerScope]
  metadataQuery.predicate = NSPredicate(format: "kMDItemUserTags == 'myTags.testTag'")
  // assign queue to NSMetadataQuery
  metadataQuery.operationQueue = queryOperationQueue
  // run query from its queue
  metadataQuery.operationQueue?.addOperation {
    metadataQuery.start()
  }
}

希望这很清楚。

最新更新