2010-08-09 8 views

Respuesta

26

Dar una NSPipe o un NSFileHandle como la tarea de standardOutput, y leer de eso.

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); 

Tenga en cuenta que si utiliza una tubería, debe preocuparse de que la tubería se llene. Si en su lugar proporciona un NSFileHandle, la tarea puede dar como resultado todo lo que quiere sin tener que preocuparse por perder ninguna, pero también obtiene la sobrecarga de tener que escribir los datos en el disco.

+0

ya lo hago eso. [task standardOutput] - Si solo llamo a esto, ¿dará la salida? – objectiveccoder001

+0

@Elijah por defecto, no. Si desea la salida, debe proporcionar un pipe o filehandle antes de iniciar la tarea, y luego comenzar a leer desde filehandle (o '[pipe fileHandleForReading]') para recuperar los datos. (Y le dará objetos 'NSData', no cadenas ni nada) –

+0

¿Puede mostrar un ejemplo? – objectiveccoder001

0

Swift 3 solución, se puede aplicar un cierre que acepta 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() 
Cuestiones relacionadas