Tengo un script PHP que tiene comandos mutliple sleep()
. Me gustaría ejecutarlo en mi aplicación con NSTask
. Mi script es el siguiente:Salida en tiempo real de NSTask
echo "first\n"; sleep(1); echo "second\n"; sleep(1); echo "third\n";
puedo ejecutar mi tarea de forma asíncrona mediante notificaciones:
- (void)awakeFromNib {
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/php"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-r", @"echo \"first\n\"; sleep(1); echo \"second\n\"; sleep(1); echo \"third\n\";", nil];
[task setArguments: arguments];
NSPipe *p = [NSPipe pipe];
[task setStandardOutput:p];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskExited:) name:NSTaskDidTerminateNotification object:task];
[task launch];
}
- (void)taskExited:(NSNotification *)notif {
NSTask *task = [notif object];
NSData *data = [[[task standardOutput] fileHandleForReading] readDataToEndOfFile];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",str);
}
Mi salida es (después de 2 segundos, por supuesto):
2011-08-03 20:45:19.474 MyApp[3737:903] first
second
third
Mi pregunta es: ¿cómo puedo obtener estas tres palabras inmediatamente después de que se impriman?
Lo intenté, pero solo se registra "primero". "segundo" y "tercero" se registran en la terminación de la tarea ... – akashivskyy
Se resolvió colocando 'readInBackgroundAndNotify' extra en' -receiveData'. ¡Gracias por la idea! – akashivskyy
Actualicé el código después de luchar por un tiempo. Necesitabas otro 'waitForDataInBackgroundAndNotify', no' readInBackgroundAndNotify'. – citelao