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, правильно?