2010-08-09 3 views

Répondre

26

Donner une NSPipe ou un NSFileHandle comme de standardOutput, et lisez la tâche de cela.

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

Notez que si vous utilisez un tuyau, vous avez à vous soucier de la conduite de remplissage vers le haut. Si vous fournissez un NSFileHandle à la place, la tâche peut générer tout ce qu'elle veut sans que vous ayez à vous soucier de perdre quoi que ce soit, mais vous avez également besoin d'écrire les données sur le disque.

+0

je fais déjà. [tâche standardOutput] - Si j'appelle juste cela, donnera-t-il la sortie? – objectiveccoder001

+0

@Elijah par défaut, non. Si vous voulez la sortie, vous devez fournir un pipe ou un handle de fichier avant de lancer la tâche, puis commencer à lire depuis le handle de fichier (ou '[pipe fileHandleForReading]') afin de récupérer les données. (Et il vous donnera des objets 'NSData', pas de chaînes ou quoi que ce soit) –

+0

Pouvez-vous montrer un exemple? – objectiveccoder001

0

Swift 3 solution, vous pouvez mettre en œuvre une fermeture qui accepte 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() 
Questions connexes