2009-12-28 78 views
2

我正在阅读NSNotificationCenter的NSFileHandleReadCompletionNotification消息以接收来自NSTask的消息。问题是我所调用的命令行程序对输出行来说比较慢,而且似乎NSFileHandleReadCompletionNotification消息的发布相对较少(我猜是什么时候缓冲区填满了)。我可以为NSFileHandleReadCompletionNotification使用较小的缓冲区吗?

是否有另一个通知消息,我可以使用它会张贴通知或每一行,或有办法使缓冲区更小?

编辑:为了清楚起见,我读了NSFileHandle documentation中缓冲区大小“模仿底层操作系统的缓冲区大小”,所以我希望还有其他一些技巧。

回答

1

如果通过

- (void)readInBackgroundAndNotify 

方法从NSFileHandle读取(右?),并在NSFileHandleReadCompletionNotification处理器解析数据 - 因此,缓冲区大小不限 - 所有“availableData”将被读取在收到通知之前的背景,然后调用readInBackgroundAndNotify再次获取下一个部分......

不过,我相信您的问题发生,由于众所周知的I/O缓冲技术。

您应该在任务命令端将缓冲关闭。 例如,如果你调用一个Perl脚本,只是把线

$|=1; 

use IO::Handle; 
STDOUT->autoflush(1); 
STDERR->autoflush(1); 

接近脚本的顶部。

对于C程序 - 使用setvbuf函数将缓冲区大小设置为零。

+1

NSFileHandle不包装C stdio流;它包装文件描述符。 'setvbuf'将不起作用。 (即使文件句柄在内部由流支持,您也无法访问该流;创建自己的流并设置其缓冲模式不会影响文件句柄的流)。 – 2009-12-29 01:06:17

+0

我很确定彼得是对的。我尝试了你的建议(通过向我的Python任务添加-u标志),并没有任何改变。 我迄今为止唯一一个尝试过的工作是在Python脚本的输出中添加一堆空格,这看起来非常可怕。 – oldpatricka 2009-12-29 03:33:40