将额外数据传递给NSTask输出处理程序

时间:2015-02-18 20:51:20

标签: macos nsnotificationcenter nstask nsnotification

我需要读取NSTask的输出。这篇文章的代码实现了这一点:How to receive output of NSTask in Cocoa?。但是,我想将其他数据传递给此函数。我试图创建一个字典并通过选择器传递,但这不起作用。

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:completion_, @"a", [outputPipe fileHandleForReading], @"b", nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readCompleted:) name:NSFileHandleReadToEndOfFileCompletionNotification object:dict];

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

首先,object:的{​​{1}}参数是将发布通知的内容。如果指定名称的通知由其他对象发布,则通知中心不会调用您的选择器。由于您的字典永远不会发布-addObserver:selector:name:object:(因为字典不发布通知),您的选择器将永远不会被调用。

所以,不要将字典作为NSFileHandleReadToEndOfFileCompletionNotification传递。它没有做你的想法。它不是将信息传递给观察方法的手段。

您可以使用更现代的基于块的观察者方法来执行此操作:

object

您必须小心保持观察对象保持活动状态,直到通知触发,但同时将其删除并释放(通过清除强引用)。我已经证明了上述情况。

答案 1 :(得分:0)

这是获取任务输出的异步解决方案。

task.standardOutput = [NSPipe pipe];
[[task.standardOutput fileHandleForReading] setReadabilityHandler:^(NSFileHandle *file) {
NSData *data = [file availableData]; // this will read to EOF, so call only once
NSLog(@"Task output! %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

// if you're collecting the whole output of a task, you may store it on a property
//[self.taskOutput appendData:data];

}];