Как улучшить поиск в папке iCloud Drive с помощью NSMetadataQuery?

Я пытаюсь вывести содержимое определенной папки в iCloud Drive с помощью NSMetadataQuery:

let query = NSMetadataQuery()

func listAllItemsInTheTestFolder() {
    guard let container = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.path else {return}
    NotificationCenter.default.addObserver(self, selector: #selector(didFinishGathering), name: .NSMetadataQueryDidFinishGathering, object: query)

    query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
    query.predicate = NSPredicate(format: "%K BEGINSWITH %@", NSMetadataItemPathKey, "\(container)/Documents/Test/")
    query.start()
}

// The issue is that it's taking close to a min and a spike in cpu usage when there are more than 10K items in the container.
// Do note: The folder I'm interested in has less than five items.
@objc func didFinishGathering() {
    query.stop()
    NotificationCenter.default.removeObserver(self, name: .NSMetadataQueryDidFinishGathering, object: query)
    let names = query.results.map{($0 as? NSMetadataItem)?.value(forAttribute: NSMetadataItemDisplayNameKey)}
    print("Count: ", query.resultCount, "names: ", names) // Expected
}

query.results есть все, что я ожидаю. Однако, когда количество элементов в облачном контейнере приложения велико (> 10 КБ), это занимает много времени и использует ~ 100% процессора в течение почти минуты.

Я попытался ограничить область поиска только тестовой папкой, установив searchScopes и/или установив searchItems:

query.searchScopes = ["\(container)/Documents/Test/"]
query.searchItems = ["\(container)/Documents/Test/"]

Но не сработало. Пожалуйста, дайте мне знать, есть ли способ ограничить поиск определенной папкой? Или, если есть другой API, который я могу использовать для повышения скорости поиска?


person Syzygy    schedule 08.11.2017    source источник


Ответы (1)


Выполните задание в другой очереди операций, чтобы поиск не зависал в пользовательском интерфейсе, и установите низкое качество обслуживания, если вы не хотите, чтобы запрос занимал весь ЦП:

let queue = OperationQueue() 
queue.qualityOfService = .background // If you want to speed up the query,
                                     // try to set a higher QoS value 
query.queue = queue
person Ramy Al Zuhouri    schedule 08.11.2017