2017-07-19 123 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时就工作了! –

相关问题