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

È stato utile?

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
scroll top