В настоящее время я создаю приложение для Mac, которое в будущем должно иметь возможность убивать и запускать приложения в OS X.
Чтобы это стало возможным, мне нужно найти способ получить список всех установленных приложений на машине.
Я уже провел довольно много исследований и решил использовать Spotlight с NSMetadataQuery, чтобы иметь возможность получить список.
Мне удалось найти это пост на указанную тему и начал реализовывать функциональность в 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 также не дала мне никаких результатов, что подводит меня к моему вопросу:
Я неправильно настроил запрос или эта команда не работает в «Эль-Капитане»?
Может кто-нибудь, пожалуйста, помогите мне найти мою ошибку? Я бы очень хотел, наконец, сделать эту работу!