NSRunningApplication "прекращено" не наблюдается
Я создаю программу, которая запускает другую программу, а затем должна контролировать ее и принимать меры, если она завершается. Когда приложение запущено, я могу получить экземпляр NSRunningApplication из NSWorkspace.
Теперь в документации указано, что NSRunningApplication имеет свойство "завершено", которое является наблюдаемым по ключевым значениям. Я пробовал реализовать:
[browserInstance addObserver:self
forKeyPath:@"terminated"
options:NSKeyValueObservingOptionNew
context:NULL];
и
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSLog(@"observeValueForKeyPath");
if ([keyPath isEqual:@"terminated"])
{
NSLog(@"terminated");
}
}
но я никогда не вижу, чтобы сработал метод registerValueForKeyPath. Кто-нибудь знает, как сделать эту работу, если это возможно? Я не смог найти какие-либо конкретные примеры в любом месте в Интернете.
Ответы
Ответ 1
Вы пробовали keyPath "isTerminated"?
Обратите внимание, что в документации для NSRunningApplication свойство terminated
указывает getter isTerminated
, а не getter . (Что имеет смысл, поскольку логическое свойство "is" или "is not" )
Это говорит о том, что может быть ошибка в анализе свойств obj-c, где имя геттера используется для пути KVO.
Ответ 2
В итоге я использовал:
NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
// Install the notifications.
[center addObserver:self
selector:@selector(appLaunched:)
name:NSWorkspaceDidLaunchApplicationNotification
object:nil];
[center addObserver:self
selector:@selector(appTerminated:)
name:NSWorkspaceDidTerminateApplicationNotification
object:nil];
И затем применяя методы appLaunched и appTerminated.
Ответ 3
Вопрос "подключен ли он": вы подтвердили, что browserInstance
не nil
, правильно?
Ответ 4
Взгляните на Apple Техническая нота 2050: Наблюдение за временем жизни без опроса.
TN2050 охватывает рекомендуемые Apple методы наблюдения за временем жизни процессов вы запускаете и запускаете другие.