2010-11-08 16 views
11

Estoy creando un programa que inicia otro programa y se supone que debe supervisarlo, y tomar medidas si termina. Cuando se inicia la aplicación, puedo obtener una instancia de NSRunningApplication desde NSWorkspace.NSRunningApplication 'terminated' not Observable

Ahora, la documentación indica que NSRunningApplication tiene la propiedad 'terminado' que es clave-valor observable. He tratado de aplicación:

[browserInstance addObserver:self 
          forKeyPath:@"terminated" 
          options:NSKeyValueObservingOptionNew 
          context:NULL]; 

Y:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 

     NSLog(@"observeValueForKeyPath"); 
     if ([keyPath isEqual:@"terminated"]) 
     { 
      NSLog(@"terminated"); 
     } 
} 

pero nunca veo el método observeValueForKeyPath obtener disparado. ¿Alguien sabe cómo hacer que esto funcione, si es posible? No he podido encontrar ningún ejemplo específico en línea.

+0

¿Alguna vez encontró la solución a esto? –

+0

Si alguien con permisos de edición lo ve puede cambiar el título a algo un poco más relavent, como "NSRunningApplication 'endedted' not Observable" –

Respuesta

0

La pregunta "¿está enchufado?": Ha verificado que browserInstance no es nil, ¿verdad?

+0

He revisado el código varias veces para asegurarme de que todo está configurado correctamente. No creo que haya un problema allí. –

3

Terminé usando:

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]; 

Y a continuación, la aplicación de la appLaunched y appTerminated métodos.

0

Eche un vistazo a Technical Note 2050: Observing Process Lifetimes Without Polling de Apple.

TN2050 cubre los métodos recomendados por Apple para observar el tiempo de vida de los procesos que ejecuta, y los iniciados por otros.

+0

Sí, pero esto no responde por qué KVO no está trabajando en NSRunningApplication 'terminated' –

+0

Recomiendo usar uno de los métodos proporcionados por Apple en TN2050. Los métodos documentados se ocupan de casos extremos y son la solución recomendada por Apple. –

+0

Tenga en cuenta que TN2050 se revisó por última vez 2008-09-10 – Perry

14

¿Has probado KeyPath "isTerminated"?

Aviso en la documentación para NSRunningApplication, la propiedad terminated especifica el captador isTerminated, en lugar del captador por defecto terminated. (Lo cual tiene sentido, como una propiedad booleana "es" o "no es")

Esto sugiere que puede haber un error en el análisis de propiedades obj-c, donde el nombre del captador se utiliza para la ruta KVO.

+0

Gracias! Debes observar en 'isTerminated'. Tú mi hombre, tienes ojos de águila. Excelente captura. Tengo 50 point-thingys –

+1

+1 Tuve esta pregunta exacta con la tecla 'finishedLaunching'. Justo lo que necesitaba, ¡ta! –