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代替,那么任务可以输出它想要的所有内容,而不必担心丢失任何内容,但是你也需要将数据写入磁盘的开销.
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)
| 归档时间: |
|
| 查看次数: |
7642 次 |
| 最近记录: |