2017-07-19 2 views
2

Nehmen wir an, ich möchte curl -o http://example.com/file.zip über eine Objective-C-App ausführen und ich möchte eine Beschriftung oder Textfeld mit dem Download-Status, der während der Ausführung des Befehls aktualisiert wird. Vielleicht könnte dies mit dispatch_async erreicht werden, aber jetzt sicher wie. Vor dem Markieren als Duplikat, die Methoden, die ich gefunden habe, führen Sie den Befehl, und nach hat es fertig Sie erhalten die Ausgabe. Ich möchte die Ausgabe erhalten, während sie läuft, ein bisschen wie ein Terminalemulator.Führen Sie einen Shell-Befehl auf Objective c und gleichzeitig Ausgabe

Antwort

2

Sie benötigen einen NSPipe zum NSTask mit der standardOutput Eigenschaft verbinden und registrieren Daten verfügbar Benachrichtigungen zu erhalten.

@interface TaskMonitor: NSObject 
@property NSPipe *outputPipe; 
@end 

@implementation TaskMonitor 

-(void)captureStandardOutput:(NSTask *)process { 

    self.outputPipe = [NSPipe new]; 
    process.standardOutput = self.outputPipe; 

    //listen for data available 
    [self.outputPipe.fileHandleForReading waitForDataInBackgroundAndNotify]; 

    [[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:self.outputPipe.fileHandleForReading queue:nil usingBlock:^(NSNotification * _Nonnull note) { 

    NSData *output = self.outputPipe.fileHandleForReading.availableData; 
    NSString *outputString = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do something with the string chunk that has been received 
     NSLog(@"-> %@",outputString); 
    }); 

    //listen again... 
    [self.outputPipe.fileHandleForReading waitForDataInBackgroundAndNotify]; 

    }]; 

} 

@end 
+0

Hallo Ich habe gerade versucht, aber hat ein Problem. Es läuft der ganze Befehl, und die Ausgabe bekommt NSLogged, wie es normalerweise in jeder NSTask, und * nach *, dass ich unbegrenzt '->' auf den Logs ohne Daten nach ihm, außer für die erste, wo es ist dies '->'. Wie gesagt ich eine 'will ->' für jedes Stück von Daten, so kann ich eigentlich die Benutzeroberfläche mit aktualisieren. –

+0

Nvm aus irgendeinem Grund arbeitete nicht auf dem Protokoll, aber funktionierte, als ich es mit der UI verband! –

Verwandte Themen