2
假設我想通過Objective C應用運行curl -o http://example.com/file.zip
,並且我希望有一個標籤或文本框,其中包含在命令運行時更新的下載狀態。也許這可以使用dispatch_async來實現,但現在確定如何。在標記爲重複之前,我找到的方法運行命令,並在完成後獲得輸出結果。我想在運行時得到輸出,就像終端模擬器一樣。在Objective C上運行shell命令並同時獲得輸出
假設我想通過Objective C應用運行curl -o http://example.com/file.zip
,並且我希望有一個標籤或文本框,其中包含在命令運行時更新的下載狀態。也許這可以使用dispatch_async來實現,但現在確定如何。在標記爲重複之前,我找到的方法運行命令,並在完成後獲得輸出結果。我想在運行時得到輸出,就像終端模擬器一樣。在Objective C上運行shell命令並同時獲得輸出
您需要使用standardOutput
屬性連接NSPipe
到NSTask
和註冊接收數據可用通知。
@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
你好,我剛剛試過這個,但有一個問題。它運行整個命令,並且輸出得到NSLogged,正如它在任何NSTask中的正常情況一樣,並且在*之後,*在日誌中沒有數據的情況下獲得無限的' - >',除了第一個數據之外沒有數據這個' - ><!DOCTYPE html>'。正如我所說的,我希望每個數據都有一個' - >',所以我可以用它更新UI。 –
由於某種原因,Nvm沒有在日誌上工作,但是當我將它連接到UI時就工作了! –