2017-11-08 5 views
1

Ich versuche, den Inhalt eines bestimmten Ordners in iCloud-Laufwerk mit NSMetadataQuery zur Liste:Wie kann ich die Suche in einem iCloud Drive-Ordner mithilfe von NSMetadataQuery verbessern?

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 alle Einzelteile Ich erwarte hat. Wenn die Anzahl der Elemente im Cloud-Container der App jedoch groß ist (> 10 KB), dauert es sehr lange und verwendet ~ 100% der CPU für fast eine Minute.

Ich habe versucht, den Suchbereich nur die Testordner zu begrenzen, indem die searchScopes Einstellung und/oder die searchItems Einstellung:

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

Aber habe nicht funktioniert. Bitte lassen Sie mich wissen, ob es eine Möglichkeit gibt, die Suche auf einen bestimmten Ordner zu beschränken? Oder wenn es eine andere API gibt, die ich für bessere Suchgeschwindigkeit verwenden kann?

Antwort

0

den Job in einer anderen Operation Warteschlange tun, so dass die Suche, nicht die UI einzufrieren und eine niedrige Qualität des Service einstellen, wenn Sie die Abfrage alle CPU nicht möchten, nehmen:

let queue = OperationQueue() 
queue.qualityOfService = .background // If you want to speed up the query, 
            // try to set a higher QoS value 
query.queue = queue 
Verwandte Themen