从nstask获取数据 - 通过命令行沟通 - 目标C
问题描述:
我知道如何将数据发送到任务:从nstask获取数据 - 通过命令行沟通 - 目标C
NSData *charlieSendData = [[charlieImputText stringValue] dataUsingEncoding:NSUTF8StringEncoding];
[[[task standardInput] fileHandleForWriting] writeData:charlieSendData];
但我怎么得到什么任务与回应?
利亚
答
举一个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
,则该任务可以输出所需的所有内容,而不必担心会丢失任何内容,但是也会产生必须将数据写入磁盘的开销。
答
斯威夫特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()
我已经做封闭。 [任务标准输出] - 如果我只是调用它,它会给出输出吗? – objectiveccoder001 2010-08-09 19:21:17
@Elijah默认情况下,没有。如果你想输出,你必须在启动任务之前提供一个管道或文件句柄,然后开始从文件句柄(或者'[pipe fileHandleForReading]')中读取数据以获取数据。 (它会给你'NSData'对象,而不是字符串或任何东西) – 2010-08-09 19:38:47
你能举个例子吗? – objectiveccoder001 2010-08-09 20:04:42