Как получить вывод 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]];
}
Если вы также хотите захватить вывод стандартной ошибки, вы можете использовать второй канал и уведомление.