从nstask获取数据 - 与命令行通信 - 目标c

obj*_*001 14 objective-c nstask nsdata

我知道如何将数据发送到任务:

NSData *charlieSendData = [[charlieImputText stringValue] dataUsingEncoding:NSUTF8StringEncoding];
[[[task standardInput] fileHandleForWriting] writeData:charlieSendData];
Run Code Online (Sandbox Code Playgroud)

但是我如何得到任务响应的内容?

以利亚

Dav*_*ong 33

给一个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);
Run Code Online (Sandbox Code Playgroud)

请注意,如果使用管道,则必须担心管道填满.如果你提供了一个NSFileHandle代替,那么任务可以输出它想要的所有内容,而不必担心丢失任何内容,但是你也需要将数据写入磁盘的开销.

  • 如何修改以尽快获取数据直到进程完成? (4认同)

onm*_*133 5

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()
Run Code Online (Sandbox Code Playgroud)