gpt4 book ai didi

swift - 在 Swift 2.2 中使用 Spotlight 列出 El Capitan 上已安装的应用程序

转载 作者:可可西里 更新时间:2023-10-31 23:35:55 25 4
gpt4 key购买 nike

我目前正在构建一个 mac 应用程序,将来应该能够在 OS X 上终止和启动应用程序。

为此,我需要找到一种方法来获取计算机上所有已安装应用程序的列表。

我已经做了很多研究,并决定使用 Spotlight 和 NSMetadataQuery 来获取列表。

我找到了 this post关于提到的主题,并开始在 Swift 2.2(项目的首选武器)中实现功能。通过一些翻译,我能够让它工作,代码现在可以成功构建和运行。然而,在运行时,我似乎遇到了查询本身的问题:

<NSMetadataQuery: 0x6080000e3880> is being deallocated without first calling -stopQuery. To avoid race conditions, you should first invoke -stopQuery on the run loop on which -startQuery was called

这是我目前使用的代码。

    public func doSpotlightQuery() {
query = NSMetadataQuery()
let predicate = NSPredicate(format: "kMDItemKind ==[c] %@", "Application")
let defaultNotificationCenter = NSNotificationCenter()
defaultNotificationCenter.addObserver(self, selector: #selector(queryDidFinish(_:)), name: NSMetadataQueryDidFinishGatheringNotification, object: nil)
query.predicate = predicate
query.startQuery()
}

public func queryDidFinish(notification: NSNotification) {
for i in 0 ... query.resultCount {
print(query.resultAtIndex(i).valueForAttribute(kMDItemDisplayName as String))
}
}

测试

mdfind "kMDItemKind == 'Application'"

我的 mac 终端中的命令(有各种变体)也没有给我任何结果,这让我想到了我的问题:

我是否以错误的方式设置了查询,或者此命令在“El Capitan”中不起作用?

有人可以帮我找出我的错误吗?我很乐意最终完成这项工作!

最佳答案

dealloc 消息似乎查询缺少强引用。

var query: NSMetadataQuery? {
willSet {
if let query = self.query {
query.stopQuery()
}
}
}

public func doSpotlightQuery() {
query = NSMetadataQuery()
let predicate = NSPredicate(format: "kMDItemKind ==[c] %@", "Application")
let defaultNotificationCenter = NSNotificationCenter()
defaultNotificationCenter.addObserver(self, selector: #selector(queryDidFinish(_:)), name: NSMetadataQueryDidFinishGatheringNotification, object: nil)
query?.predicate = predicate
query?.startQuery()
}

public func queryDidFinish(notification: NSNotification) {
guard let query = notification.object as? NSMetadataQuery else {
return
}

for i in 0 ... query.resultCount {
print(query.resultAtIndex(i).valueForAttribute(kMDItemDisplayName as String))
}
}

我建议使用不同的谓词,因为根据 John 的评论 here,kMDItemKind 是本地化的键

所以 let predicate = NSPredicate(format: "kMDItemContentType == 'com.apple.application-bundle'") 将适用于我们正在做的事情。

在 swift 3 中,这看起来像这样:

var query: NSMetadataQuery? {
willSet {
if let query = self.query {
query.stop()
}
}
}

public func doSpotlightQuery() {
query = NSMetadataQuery()
let predicate = NSPredicate(format: "kMDItemContentType == 'com.apple.application-bundle'")
NotificationCenter.default.addObserver(self, selector: #selector(queryDidFinish(_:)), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)
query?.predicate = predicate
query?.start()
}

public func queryDidFinish(_ notification: NSNotification) {
guard let query = notification.object as? NSMetadataQuery else {
return
}

for result in query.results {
guard let item = result as? NSMetadataItem else {
print("Result was not an NSMetadataItem, \(result)")
continue
}
print(item.value(forAttribute: kMDItemDisplayName as String))
}
}

关于swift - 在 Swift 2.2 中使用 Spotlight 列出 El Capitan 上已安装的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38054999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com