任何机构都知道在执行NSTask时从NSTask获取通知。我使用NSTask解压缩zip文件,需要在NSProgressBar中显示解压缩数据进度。 我没有找到做这样任务的任何想法。所以我在进度条中显示了价值。 需要帮助来完成这项任务。 提前谢谢。
答案 0 :(得分:2)
使用NSFileHandleReadCompletionNotification
,NSTaskDidTerminateNotification
通知。
task=[[NSTask alloc] init];
[task setLaunchPath:Path];
NSPipe *outputpipe=[[NSPipe alloc]init];
NSPipe *errorpipe=[[NSPipe alloc]init];
NSFileHandle *output,*error;
[task setArguments: arguments];
[task setStandardOutput:outputpipe];
[task setStandardError:errorpipe];
output=[outputpipe fileHandleForReading];
error=[errorpipe fileHandleForReading];
[task launch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name: NSFileHandleReadCompletionNotification object:output];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedError:) name: NSFileHandleReadCompletionNotification object:error];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TaskCompletion:) name: NSTaskDidTerminateNotification object:task];
//[input writeData:[NSMutableData initWithString:@"test"]];
[output readInBackgroundAndNotify];
[error readInBackgroundAndNotify];
[task waitUntilExit];
[outputpipe release];
[errorpipe release];
[task release];
[pool release];
/* Called when there is some data in the output pipe */
-(void) receivedData:(NSNotification*) rec_not
{
NSData *dataOutput=[[rec_not userInfo] objectForKey:NSFileHandleNotificationDataItem];
[[rec_not object] readInBackgroundAndNotify];
[strfromdata release];
}
/* Called when there is some data in the error pipe */
-(void) receivedError:(NSNotification*) rec_not
{
NSData *dataOutput=[[rec_not userInfo] objectForKey:NSFileHandleNotificationDataItem];
if( !dataOutput)
NSLog(@">>>>>>>>>>>>>>Empty Data");
[[rec_not object] readInBackgroundAndNotify];
}
/* Called when the task is complete */
-(void) TaskCompletion :(NSNotification*) rec_not
{
}
答案 1 :(得分:2)
为了显示进度,您需要找出两件事:
您可以通过阅读解压缩任务的输出找到它们。 Parag Bafna的回答是一个开始;在receivedData:
中,您需要解析输出以确定刚刚发生的进展,然后将该进度添加到目前为止的进度计数中(例如++_filesUnzippedSoFar
)。
第一部分,找出工作的总规模,比较棘手。你基本上需要在运行解压缩之前运行解压缩:第一个,-l
(小写的L),是列出存档的内容;第二是解压缩它。第一个,您读取输出以确定存档包含多少文件/字节;第二个,您读取输出以确定将进度条前进到的值。
设置进度条的属性很容易;这些只是doubleValue
和maxValue
。找出你工作的地方是困难的部分,并且非常特定领域 - 你需要阅读解压缩的输出(两次,以不同的形式),了解它告诉你的内容,并将其转化为进度信息。
NSTask中没有任何内容可以帮助您。 NSTask的部分内容始于standardOutput
属性。它不了解zip文件,档案,档案内容甚至进度,因为这些都不适用于大多数任务。这些都是你的任务所特有的,这意味着你必须编写代码来完成它。