Как получить вывод NSTask в Какао?

Я использую NSTask в своем приложении Какао, и мне нужно иметь возможность получить результат и сохранить его в массиве, или что-то в этом роде... Я выполняю команды терминала из приложения, и мне нужны выходные данные для них.

NSString *path = @"/path/to/command";
NSArray *args = [NSArray arrayWithObjects:..., nil];
[[NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit];

//After task is finished , need output

Большое спасибо!

1 ответ

Решение

Вы хотите использовать -[NSTask setStandardOutput:], чтобы присоединить NSPipe к задаче перед ее запуском. Канал содержит два дескриптора файла, задача будет записывать в один конец канала, а вы будете читать из другого. Вы можете запланировать дескриптор файла, чтобы прочитать все данные из фоновой задачи и уведомить вас, когда она будет завершена.

Это будет выглядеть примерно так (скомпилировано с переполнением стека):

- (void)launch {
    NSTask *task = [[[NSTask alloc] init] autorelease];
    [task setLaunchPath:@"/path/to/command"];
    [task setArguments:[NSArray arrayWithObjects:..., nil]];
    NSPipe *outputPipe = [NSPipe pipe];
    [task setStandardOutput:outputPipe];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readCompleted:) name:NSFileHandleReadToEndOfFileCompletionNotification object:[outputPipe fileHandleForReading]];
    [[outputPipe fileHandleForReading] readToEndOfFileInBackgroundAndNotify];
    [task launch];
}

- (void)readCompleted:(NSNotification *)notification {
    NSLog(@"Read data: %@", [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]);
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:[notification object]];
}

Если вы также хотите захватить вывод стандартной ошибки, вы можете использовать второй канал и уведомление.

Другие вопросы по тегам