我正在从NSNotificationCenter读取NSFileHandleReadCompletionNotification消息以接收来自NSTask的消息。问题是我正在调用的命令行程序输出行相对较慢,并且似乎NSFileHandleReadCompletionNotification消息相对不经常发布(我想当缓冲区填满时)。
我是否可以使用其他通知消息发布通知或每行,或者是否有办法使缓冲区更小?
编辑:为了清楚起见,我在NSFileHandle documentation中读到缓冲区大小“模仿底层操作系统的缓冲区大小”,所以,我希望还有其他一些技巧。
答案 0 :(得分:1)
如果您通过
阅读NSFileHandle- (void)readInBackgroundAndNotify
方法(对吗?),并在 NSFileHandleReadCompletionNotification 处理程序中解析数据 - 因此,缓冲区大小不受限制 - 在收到通知之前,所有“availableData”都将在后台读取,然后再次调用 readInBackgroundAndNotify 来获取下一部分......
但是我相信您的问题是由于众所周知的I / O缓冲技术而发生的。
您应该在任务命令端关闭缓冲。 例如,如果您调用Perl脚本,只需将行
$|=1;
或
use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);
靠近剧本的顶部。
对于C程序 - 使用setvbuf函数将缓冲区大小设置为零。