NSTask's real-time output

前端 未结 2 1982
情话喂你
情话喂你 2020-12-25 15:00

I have a PHP script which has mutliple sleep() commands. I would like to execute it in my application with NSTask. My script looks like this:

2条回答
  •  遥遥无期
    2020-12-25 15:25

    You can use NSFileHandle's waitForDataInBackgroundAndNotify method to receive a notification when the script writes data to its output. This will only work, however, if the interpreter sends the strings immediately. If it buffers output, you will get a single notification after the task exits.

    - (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];
        NSFileHandle *fh = [p fileHandleForReading];
        [fh waitForDataInBackgroundAndNotify];
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name:NSFileHandleDataAvailableNotification object:fh];
    
        [task launch];
    
    }
    
    - (void)receivedData:(NSNotification *)notif {
        NSFileHandle *fh = [notif object];
        NSData *data = [fh availableData];
        if (data.length > 0) { // if data is found, re-register for more data (and print)
            [fh waitForDataInBackgroundAndNotify];
            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@" ,str);
        }
    }
    

提交回复
热议问题