Как получить вывод NSTask в Какао? - PullRequest
5 голосов
/ 09 октября 2011

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

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

//After task is finished , need output

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

1 Ответ

16 голосов
/ 09 октября 2011

Вы хотите использовать - [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]];
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...