我需要读取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];
有什么想法吗?
答案 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];
}];