在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中的正常情况一样,并且在*之后,*在日志中没有数据的情况下获得无限的' - >',除了第一个数据之外没有数据这个' - >'。正如我所说的,我希望每个数据都有一个' - >',所以我可以用它更新UI。 –
由于某种原因,Nvm没有在日志上工作,但是当我将它连接到UI时就工作了! –