не будет работать, потому что задача ожидает опустошения канала, поэтому она может писать больше, пока ваша программа ожидает окончания данных. Таким образом, ваша программа будет зависать. Эта конструкция уведомления и наблюдателя позволяет асинхронно считывать канал и, таким образом, предотвращает вышеупомянутую патовую ситуацию.

я есть сценарий PHP, который имеет mutliplesleep() команды. Я хотел бы выполнить это в моем приложении сNSTask, Мой сценарий выглядит так:

echo "first\n"; sleep(1); echo "second\n"; sleep(1); echo "third\n";

Я могу выполнить свою задачу асинхронно, используя уведомления:

- (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);
}

Мой вывод (через 2 секунды, конечно):

2011-08-03 20:45:19.474 MyApp[3737:903] first
second
third

Мой вопрос: как я могу получить эти три слова сразу после того, как они напечатаны?

Ответы на вопрос(2)

Ваш ответ на вопрос