NSRunningApplication'终止'不可观察

时间:2010-11-08 20:57:46

标签: objective-c cocoa macos

我正在构建一个启动另一个程序的程序,然后应该监视它,并在它终止时采取行动。启动应用程序后,我可以从 NSWorkspace 获取 NSRunningApplication 的实例。

现在,文档指出 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");  
        }  
} 

但我从未看到 observeValueForKeyPath 方法被触发。如果有可能,有谁知道如何使这项工作?我无法在网上找到任何具体的例子。

4 个答案:

答案 0 :(得分:16)

您是否尝试过keyPath“isTerminated”?

请注意,在NSRunningApplication的文档中,属性terminated指定了getter isTerminated,而不是默认的getter terminated。 (这是有道理的,因为布尔属性“是”或“不是”)

这表明obj-c属性解析可能存在错误,其中getter的名称用于KVO路径。

答案 1 :(得分:4)

我最终使用了:

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 方法。

答案 2 :(得分:0)

“它是否插入”问题:您已经确认browserInstance不是nil,对吗?

答案 3 :(得分:0)

看一下Apple的Technical Note 2050: Observing Process Lifetimes Without Polling

TN2050涵盖了Apple推荐的方法,用于观察您启动的流程的生命周期以及其他人发布的流程。