Решение выше зависает, потому что это синхронно.Вызов [server waitUntilExit]
блокирует цикл выполнения до тех пор, пока задачи не будут выполнены.
Вот асинхронное решение для получения вывода задачи.
task.standardOutput = [NSPipe pipe];
[[task.standardOutput fileHandleForReading] setReadabilityHandler:^(NSFileHandle *file) {
NSData *data = [file availableData]; // this will read to EOF, so call only once
NSLog(@"Task output! %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// if you're collecting the whole output of a task, you may store it on a property
[self.taskOutput appendData:data];
}];
Возможно, вы хотите повторить то же самое выше для task.standardError
.
ВАЖНО:
Когда ваша задача завершается, вы должны установить для блока readabilityHandler значение nil;в противном случае вы столкнетесь с высокой загрузкой ЦП, поскольку чтение никогда не прекратится.
[task setTerminationHandler:^(NSTask *task) {
// do your stuff on completion
[task.standardOutput fileHandleForReading].readabilityHandler = nil;
[task.standardError fileHandleForReading].readabilityHandler = nil;
}];
Это все асинхронно (и вы должны делать это асинхронно), поэтому у вашего метода должен быть блок завершения ^.1015 *