2009-12-28 81 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