gpt4 book ai didi

cocoa - 如何逐步从NSTask中检索数据?

转载 作者:行者123 更新时间:2023-12-03 17:36:49 24 4
gpt4 key购买 nike

我正在为命令行工具开发 GUI (Cocoa),以使其更易于人们使用。尽管它是一个 GUI,但我想将输出显示到 NSTextView。问题在于输出量很大,并且该工具执行的分析可能需要数小时/数天的时间。

通常,在使用 NSTask 和 NSPipe 时,仅在任务完全完成后才会显示输出(这可能需要很长时间)。我想做的是将输出分开并逐渐显示(例如每分钟更新一次)。

到目前为止,我已将数据处理放在单独的线程中:

[NSThread detachNewThreadSelector:@selector(processData:) toTarget:self withObject:raxmlHandle];

- (void)processData:(id)sender {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *startString = [results string];
NSString *newString = [[NSString alloc] initWithData:[raxmlHandle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
[results setString:[startString stringByAppendingString:newString]];
[startString release];
[newString release];
[pool release];
}

所有这些对我来说仍然有点巫术,我不太确定如何应对这一挑战。

您有什么建议或建议吗?

谢谢!

最佳答案

您需要使用NSFileHandle提供的通知。

首先,将您自己添加为 NSFileHandleReadCompletionNotification 的观察者

[[NSNotificationCenter defaultCenter] addObserver:self  
selector:@selector(outputReceived:)
name:NSFileHandleReadCompletionNotification
object:nil];

然后,准备一个任务,调用readInBackgrounAndNotify管道的文件句柄,然后启动任务。

NSTask*task=[[NSTask alloc] init];
[task setLaunchPath:...];

NSPipe*pipe=[NSPipe pipe];
[task setStandardOutput:pipe];
[task setStandardError:pipe];

// this causes the notification to be fired when the data is available
[[pipe fileHandleForReading] readInBackgroundAndNotify];

[task launch];

现在,要实际接收数据,您需要定义一个方法

-(void)outputReceived:(NSNotification*)notification{
NSFileHandle*fh=[notification object];
// it might be good to check that this file handle is the one you want to read
...

NSData*d=[[aNotification userInfo] objectForKey:@"NSFileHandleNotificationDataItem"];
... do something with data ...
}

您可能想阅读Notification Programming Topics了解发生了什么。

关于cocoa - 如何逐步从NSTask中检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com