Ottenere i dati dal nstask - comunicare con la linea di comando - Objective C
-
27-09-2019 - |
Domanda
So come inviare i dati al compito:
NSData *charlieSendData = [[charlieImputText stringValue] dataUsingEncoding:NSUTF8StringEncoding];
[[[task standardInput] fileHandleForWriting] writeData:charlieSendData];
Ma come faccio ad ottenere ciò che gli risponde attività con ??
Elia
Soluzione
Dare un NSPipe
o un NSFileHandle
come standardOutput
del compito, e leggere da questo.
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);
Si noti che se si utilizza un tubo, si deve preoccupare il tubo riempiendo. Se si fornisce un NSFileHandle
invece, la lattina di uscita compito tutto ciò che vuole, senza dover preoccuparsi di perdere, ma si ottiene anche il sovraccarico di dover scrivere i dati su disco.
Altri suggerimenti
Swift 3 soluzione, è possibile implementare una chiusura che accetta un 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow