我尝试使用NSMetadataQuery和NSPredicate来搜索文件。经过几个小时的尝试和寻找解决方案(我是swift的新手),我有一个小例子。它编译得很好,但结果为零。我尝试了不同的谓词,但最后metadataQuery.resultCount始终为0。 任何人都有想法会出错?
class AppDelegate: NSObject, NSApplicationDelegate {
var metadataQuery: NSMetadataQuery!
var metadataQueryDidUpdateObserver: AnyObject?
var metadataQueryDidFinishGatheringObserver: AnyObject?
@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(aNotification: NSNotification) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "initalGatherComplete:", name: NSMetadataQueryDidFinishGatheringNotification, object: nil)
metadataQuery = NSMetadataQuery()
metadataQuery.searchScopes = [NSMetadataQueryIndexedLocalComputerScope]
metadataQuery.predicate = NSPredicate(format: "%K LIKE '*'", NSMetadataItemFSNameKey)
metadataQuery.startQuery()
}
func initalGatherComplete(notification: NSNotification) {
metadataQuery.stopQuery()
let resultCounter = metadataQuery.resultCount
NSLog("%lu", resultCounter)
NSNotificationCenter.defaultCenter().removeObserver(self, name: NSMetadataQueryDidFinishGatheringNotification, object: nil)
}
最后但并非最不重要:当前谓词应该列出所有文件,但最后谓词应该只列出应用程序。什么是创建这样一个谓词的最佳实践?我打算过滤扩展名.app,但也许有更好的方法?
谢谢!
答案 0 :(得分:4)
检查predicate syntax。 LIKE
运算符不适用于NSMetadataQuery
谓词搜索(实际上NSPredicate
在Spotlight元数据搜索的上下文中使用了非常相似但实际上不同的运算符和行为集。)
NSMetadataQuery
的glob搜索语法只使用等号:
NSPredicate(format: "%K ==[cd] '*'", NSMetadataItemFSNameKey)