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
2
A
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
Verwandte Themen
- 1. Führen Sie einen Shellbefehl aus, der sich in einem Projektordner von Grunt-Task
- 2. So führen Sie zwei Funktionen gleichzeitig aus
- 3. iOS9 Objective-C Führen Sie GPS im Hintergrund mit Timer
- 4. NSDateFormat Ausgabe in Objective-c
- 5. Sublime text 2 - Wie man einen Shellbefehl über ssh ausführt?
- 6. Führen Sie einen Ruby-Skript auf Windows
- 7. Führen Sie eine Schluckuhr gleichzeitig als gretty
- 8. Führen Sie mehrere Python-Skripts gleichzeitig aus
- 9. Pointer Ausgabe über Objective-C-Objekte
- 10. IOS Objective C ARC Conversion Ausgabe
- 11. So führen Sie mehrere Mapper gleichzeitig in einem Knoten aus
- 12. Führen Sie einen versteckten Cmd auf Klick
- 13. Wie Live-Audio-Streaming und Download gleichzeitig in IOS mit Objective c
- 14. Objective-C und Komponentenprogrammierung
- 15. Objective-C und Android
- 16. C-Buchse: recv und senden Sie gleichzeitig
- 17. Führen Sie einen Windows-Dienst auf IIS
- 18. Ist Objective-C++ eine Obermenge von C++ und Objective-C?
- 19. Mischen von C++ und Objective C
- 20. objective c auf windows und gcc
- 21. Wie überprüfen Sie in objective-c und Kakao auf Vernunft?
- 22. Führen Sie einen Befehl in einem Windows-Remote-Server und erhalten Sie die Konsole-Ausgabe in C#. NET
- 23. Android und Objective-C
- 24. Führen Sie einen Python-Befehl innerhalb von vim aus und rufen Sie die Ausgabe ab.
- 25. Wie auf iOS (schnelle und Objective-c)
- 26. Spiel Programmierung auf Objective-C und Linux
- 27. C: Einen Systembefehl ausführen und Ausgabe erhalten?
- 28. Bildgröße auf Objective-c,
- 29. biginteger auf Objective-c
- 30. So führen Sie mehrere asynchrone Tasks gleichzeitig aus
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. –
Nvm aus irgendeinem Grund arbeitete nicht auf dem Protokoll, aber funktionierte, als ich es mit der UI verband! –