我正在构建一个启动另一个程序的程序,然后应该监视它,并在它终止时采取行动。启动应用程序后,我可以从 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 方法被触发。如果有可能,有谁知道如何使这项工作?我无法在网上找到任何具体的例子。
答案 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推荐的方法,用于观察您启动的流程的生命周期以及其他人发布的流程。