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