2017-11-08 29 views
1

나는 NSMetadataQuery를 사용하여 아이 클라우드 드라이브의 특정 폴더의 내용을 나열하기 위해 노력하고있어 : NSMetadataQuery를 사용하여 iCloud Drive 폴더 검색을 개선하려면 어떻게해야합니까?

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

은 내가 기대하고있어 모든 항목이 있습니다. 그러나 앱의 클라우드 컨테이너에있는 항목 수가 많으면 (10K 이상) 오랜 시간이 걸리며 최소 100 분의 1 초 동안 CPU의 100 %를 사용합니다.

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

을하지만 작동하지 않았다 :

은 내가 searchScopes 설정 및/또는 searchItems 설정하여 바로 테스트 폴더로 검색 범위를 제한하려고 노력했다. 검색을 특정 폴더로 제한 할 수있는 방법이 있다면 알려주시겠습니까? 아니면 더 나은 검색 속도를 위해 사용할 수있는 다른 API가 있다면?

let queue = OperationQueue() 
queue.qualityOfService = .background // If you want to speed up the query, 
            // try to set a higher QoS value 
query.queue = queue 
: 쿼리가 모든 CPU하는 것을 원하지 않는 경우 검색 UI를 동결 및 서비스의 낮은 품질을 설정하지 않도록

답변

0

는 다른 작업 큐의 작업을 수행