CFStreamCreateBoundPair流以较小的缓冲区大小丢失数据

时间:2013-05-17 04:28:43

标签: objective-c streaming buffer nsurlconnection nsstream

我正在尝试在Objective-C中使用libxml2创建流式html解析器。我有一个下载数据的NSURLConnection,我在NSInputStream和NSOutputstream中创建了CFStreamCreateBoundPair,缓冲区大小为10个字节。当从NSURLConnection接收数据时,我将其写入输出流。当收到的数据量大于缓冲区大小时,左侧数据丢失时出现。这应该发生吗?根据我的理解,我认为数据将排队并以缓冲区大小的块写入输入流。

CFStreamCreateBoundPair Reference

1 个答案:

答案 0 :(得分:1)

您需要确保收到的块中的所有数据最终都写入流中。

您可以通过委托方法中的一个简单循环来执行此操作,在该方法中,您可以连续写入已接收块的一部分,直到它完全写入流中。但是,这可能导致委托运行的线程无法阻塞:如果使用者没有准备好消耗更多字节,则输出流将在尝试写入更多数据时阻塞。

或者,您可以将NSData对象异步调度到块正在执行循环的队列,并在完成之前写入所有数据。但是,如果消费者速度很慢且数据很大,这可能会导致系统内存不足 - 因为所有NSData都存在于调度队列中,直到块完成。

这两种方法都有利有弊。我倾向于选择第一个,因为没有内存问题,连接会将输入字节缓冲到某个上限 - 在它停止确认更多字节之前。