我正在执行NSMetadataQuery,我获得了文件和目录的所有URL。
func initSearchQuery(){
print("\(logClassName): initSearchQuery")
searchQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
let searchPredicate = NSPredicate.init(format: "%K like '*'", argumentArray: [NSMetadataItemFSNameKey])
searchQuery.predicate = searchPredicate
NotificationCenter.default.addObserver(self, selector: #selector(updateDataWithNotification), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: searchQuery)
NotificationCenter.default.addObserver(self, selector: #selector(updateDataWithNotification), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: searchQuery)
searchQuery.enableUpdates()
searchQuery.start()
}
有没有办法做一个只提供目录URL的谓词?
经过一番研究,我终于解决了我的问题。
我们假设我们有iCloud文件夹的路径
var iCloudUrl = fileManager.url(forUbiquityContainerIdentifier: nil)
iCloudUrl = iCloudUrl.appendingPathComponent("Documents")
现在我们想在iCloud Documents文件夹中为folder1执行NSMetadataQuery。
我们可以通过声明NSPredicate来访问内容:
let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path])
它将返回文件夹,文件和子文件夹的所有URL。
1)如果我们只想获取文件,那么NSPredicate将会是这样的
let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && NOT %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])
2)如果我们想要计算它有多少个文件夹和子文件夹
let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])