2010-08-09 4 views

risposta

26

dare una NSPipe o un NSFileHandle come il compito del standardOutput, e leggere da questo.

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

Si noti che se si utilizza un tubo, è necessario preoccuparsi del riempimento del tubo. Se invece si fornisce uno NSFileHandle, l'attività può produrre tutto ciò che desidera senza che si debba preoccuparsi di perdere qualsiasi, ma si ottiene anche il sovraccarico di dover scrivere i dati sul disco.

+0

ho già faccio. [task standardOutput] - Se lo chiamo, darà l'output? – objectiveccoder001

+0

@Elijah per impostazione predefinita, no. Se si desidera l'output, è necessario fornire un pipe o un filehandle prima di avviare l'attività, quindi avviare la lettura dal filehandle (o '[pipe fileHandleForReading]') per recuperare i dati. (E ti darà oggetti 'NSData', non stringhe o altro) –

+0

Puoi mostrare un esempio? – objectiveccoder001

0

Swift 3 soluzione, è possibile implementare una chiusura che accetta 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()