2013-05-17 149 views
1

我試圖創建在Objective-C的libxml2流HTML解析器。我有下載數據的NSURLConnection的,我已經在NSInputStream和NSOutputstream用的10個字節的小的緩衝區大小創建了CFStreamCreateBoundPair。當從NSURLConnection接收數據時,我將它寫入輸出流。當收到的數據量大於緩衝區大小時,就會顯示剩餘數據丟失。這是否應該發生?根據我的理解,我認爲數據將排隊並按緩衝區大小寫入輸入流。CFStreamCreateBoundPair流數據丟失的小緩衝區大小

CFStreamCreateBoundPair Reference

回答

1

您需要確保從接收到的塊的所有數據最終被寫入到流。

你可能與委託方法,直到它完全寫入流中,你連寫接收到的塊的一部分的簡單循環做到這一點。但是,這可能會導致代理運行的線程不可預知地阻塞:如果消費者未準備好消耗更多字節,則在嘗試寫入更多數據時,輸出流將會阻塞。

或者,您可能會異步地將NSData對象分派到塊正在執行循環的隊列,並在完成之前寫入所有數據。然而,這可能會導致你的系統運行的內存如果消費者是緩慢的,數據是大 - 因爲所有NSData住在調度隊列中,直到塊結束。

兩種方法各有利弊。我更喜歡第一個,因爲沒有內存問題,並且連接會將傳入字節緩存到某個上限 - 在它停止確認更多字節之前。