从NSTask获取任务进度通知

时间:2013-07-22 12:59:22

标签: macos cocoa nstask nsnotification

任何机构都知道在执行NSTask时从NSTask获取通知。我使用NSTask解压缩zip文件,需要在NSProgressBar中显示解压缩数据进度。 我没有找到做这样任务的任何想法。所以我在进度条中显示了价值。 需要帮助来完成这项任务。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

使用NSFileHandleReadCompletionNotificationNSTaskDidTerminateNotification通知。

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),是列出存档的内容;第二是解压缩它。第一个,您读取输出以确定存档包含多少文件/字节;第二个,您读取输出以确定将进度条前进到的值。

设置进度条的属性很容易;这些只是doubleValuemaxValue。找出你工作的地方是困难的部分,并且非常特定领域 - 你需要阅读解压缩的输出(两次,以不同的形式),了解它告诉你的内容,并将其转化为进度信息。

NSTask中没有任何内容可以帮助您。 NSTask的部分内容始于standardOutput属性。它不了解zip文件,档案,档案内容甚至进度,因为这些都不适用于大多数任务。这些都是你的任务所特有的,这意味着必须编写代码来完成它。