我一直在寻找答案很长时间,但我从来没有得到一个有效的代码。
我有一个使用dd生成文件的代码。有时需要几分钟,具体取决于大小,我认为有一个进度条会很棒。到目前为止,一切正常并已绑定。但是,进度条不会更新,因为我需要不断地向它发送值。我找到了一种获取当前值的方法,我设法让pv显示当前数据,但现在我无法在应用程序内部实时获取输出,除了在日志中。
到目前为止,这是我最好的:
// Action:
// dd if=/dev/zero bs=1048576 count=500 |pv -Wn -s <size>|of=/Users/me/Desktop/asd.img
// Be careful, it generates files of 500MB!!
NSTask * d1Task = [[NSTask alloc] init];
NSTask * pvTask = [[NSTask alloc] init];
NSTask * d2Task = [[NSTask alloc] init];
[d1Task setLaunchPath:@"/bin/dd"];
[pvTask setLaunchPath:@"/Users/me/Desktop/pv"];
[d2Task setLaunchPath:@"/bin/dd"];
// For pvTask I use something like...
// [[NSBundle mainBundle] pathForAuxiliaryExecutable: @"pv"]
// ... in the final version.
[d1Task setArguments: [NSArray arrayWithObjects:
@"if=/dev/zero"
, @"bs=1048576"
, @"count=500"
, nil]];
[pvTask setArguments:[NSArray arrayWithObjects:
@"-Wn"
, [ NSString stringWithFormat:@"-s %d", 1048576 * 500]
, nil]];
[d2Task setArguments: [NSArray arrayWithObjects:
@"of=/Users/me/Desktop/file.dmg"
, nil]];
NSPipe * pipeBetween1 = [NSPipe pipe];
[d1Task setStandardOutput: pipeBetween1];
[pvTask setStandardInput: pipeBetween1];
NSPipe * pipeBetween2 = [NSPipe pipe];
[pvTask setStandardOutput: pipeBetween2];
[d2Task setStandardInput: pipeBetween2];
// Missing code here
[d1Task launch];
[pvTask launch];
[d2Task launch];
在缺少的代码部分,我尝试了几件事。首先,我尝试了一个观察者,如下所示:
NSFileHandle * pvOutput = [pipeBetween2 fileHandleForReading];
[pvOutput readInBackgroundAndNotify];
[ [NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(outputData:)
name:NSFileHandleDataAvailableNotification
object:pvOutput
];
没有成功。我只在执行开始或结束时得到反馈,但在执行过程中仍然没有反馈。
我也尝试过类似的东西:
[pvOutput setReadabilityHandler:^(NSFileHandle *file) {
// Stuff here
}];
但是这里没有这样的方法。也许我的 XCode 已经过时了?(我使用 4.2)。
最近我一直在尝试使用/sbin/ping对服务器执行 10 次相同的通用代码,但没有成功获得输出。我怎样才能做到这一点?我可以阅读有关此主题的任何文件吗?
谢谢!