2017-07-19 179 views
2

假設我想通過Objective C應用運行curl -o http://example.com/file.zip,並且我希望有一個標籤或文本框,其中包含在命令運行時更新的下載狀態。也許這可以使用dispatch_async來實現,但現在確定如何。在標記爲重複之前,我找到的方法運行命令,並在完成後獲得輸出結果。我想在運行時得到輸出,就像終端模擬器一樣。在Objective C上運行shell命令並同時獲得輸出

回答

2

您需要使用standardOutput屬性連接NSPipeNSTask和註冊接收數據可用通知。

@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

你好,我剛剛試過這個,但有一個問題。它運行整個命令,並且輸出得到NSLogged,正如它在任何NSTask中的正常情況一樣,並且在*之後,*在日誌中沒有數據的情況下獲得無限的' - >',除了第一個數據之外沒有數據這個' - ><!DOCTYPE html>'。正如我所說的,我希望每個數據都有一個' - >',所以我可以用它更新UI。 –

+0

由於某種原因,Nvm沒有在日誌上工作,但是當我將它連接到UI時就工作了! –

相關問題