Невозможно получить результаты для поискового поиска пользовательских тегов с помощью NSMetadataquery и kMDItemUserTags

Я пришел в себя после попытки добавить подпрограмму в мой контроллер для поиска на компьютере пользователя файлов пользователя с указанными тегами пользователя (Mavericks+). Я сталкиваюсь с блоком, где начинается поиск, но результаты не возвращаются, и очередь операций равна нулю.

Вот код:

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)
}

Когда я запускаю приведенный выше код, он показывает очередь результатов как ноль, а результат считается как ноль. Даже если я удалю цикл isGathering, функции batchReturned и initialGatherComplete никогда не будут вызваны.

Я подозреваю, что может быть проблема с форматированием предиката, но это прекрасно работает, когда я помещаю запрос в терминал с mdfind.

0 ответов

Из документации 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()
  }
}

Надеюсь, это ясно.

Другие вопросы по тегам