从nstask获取数据 - 通过命令行沟通 - 目标C

问题描述:

我知道如何将数据发送到任务:从nstask获取数据 - 通过命令行沟通 - 目标C

NSData *charlieSendData = [[charlieImputText stringValue] dataUsingEncoding:NSUTF8StringEncoding]; 
[[[task standardInput] fileHandleForWriting] writeData:charlieSendData]; 

但我怎么得到什么任务与回应?

利亚

举一个NSPipeNSFileHandle作为任务的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,则该任务可以输出所需的所有内容,而不必担心会丢失任何内容,但是也会产生必须将数据写入磁盘的开销。

+0

我已经做封闭。 [任务标准输出] - 如果我只是调用它,它会给出输出吗? – objectiveccoder001 2010-08-09 19:21:17

+0

@Elijah默认情况下,没有。如果你想输出,你必须在启动任务之前提供一个管道或文件句柄,然后开始从文件句柄(或者'[pipe fileHandleForReading]')中读取数据以获取数据。 (它会给你'NSData'对象,而不是字符串或任何东西) – 2010-08-09 19:38:47

+0

你能举个例子吗? – objectiveccoder001 2010-08-09 20:04:42

斯威夫特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()