Получение данных из nstask - связь с командной строкой - цель c - PullRequest
14 голосов
/ 09 августа 2010

Я знаю, как отправить данные в задачу:

NSData *charlieSendData = [[charlieImputText stringValue] dataUsingEncoding:NSUTF8StringEncoding];
[[[task standardInput] fileHandleForWriting] writeData:charlieSendData];

Но как мне получить ответ на задачу ??

Илия

Ответы [ 2 ]

33 голосов
/ 09 августа 2010

Дайте NSPipe или NSFileHandle в качестве standardOutput задания и прочитайте его.

NSTask * list = [[NSTask alloc] init];
[list setLaunchPath:@"/bin/ls"];
[list setCurrentDirectoryPath:@"/"];

NSPipe * out = [NSPipe pipe];
[list setStandardOutput:out];

[list launch];
[list waitUntilExit];
[list release];

NSFileHandle * read = [out fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * stringRead = [[[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"output: %@", stringRead);

Обратите внимание, что если вы используете трубу, вам нужно беспокоиться о ее заполнении. Если вместо этого вы предоставите NSFileHandle, задача может вывести все, что ей нужно, и вам не придется беспокоиться о ее потере, но вы также получите дополнительные расходы на запись данных на диск.

4 голосов
/ 11 марта 2017

Решение Swift 3, вы можете реализовать замыкание, которое принимает FileHandle

let process = Process()
process.launchPath = launchPath
process.arguments = arguments

let stdOut = Pipe()
process.standardOutput = stdOut
let stdErr = Pipe()
process.standardError = stdErr

let handler =  { (file: FileHandle!) -> Void in
  let data = file.availableData
  guard let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
    else { return}

  print(output.components(separatedBy: "\n").first!)
}

stdErr.fileHandleForReading.readabilityHandler = handler
stdOut.fileHandleForReading.readabilityHandler = handler

process.terminationHandler = { (task: Process?) -> () in
  stdErr.fileHandleForReading.readabilityHandler = nil
  stdOut.fileHandleForReading.readabilityHandler = nil
}

process.launch()
process.waitUntilExit()
...