我正在尝试在Objective-C中使用libxml2创建流式html解析器。我有一个下载数据的NSURLConnection,我在NSInputStream和NSOutputstream中创建了CFStreamCreateBoundPair
,缓冲区大小为10个字节。当从NSURLConnection接收数据时,我将其写入输出流。当收到的数据量大于缓冲区大小时,左侧数据丢失时出现。这应该发生吗?根据我的理解,我认为数据将排队并以缓冲区大小的块写入输入流。
答案 0 :(得分:1)
您需要确保收到的块中的所有数据最终都写入流中。
您可以通过委托方法中的一个简单循环来执行此操作,在该方法中,您可以连续写入已接收块的一部分,直到它完全写入流中。但是,这可能导致委托运行的线程无法阻塞:如果使用者没有准备好消耗更多字节,则输出流将在尝试写入更多数据时阻塞。
或者,您可以将NSData
对象异步调度到块正在执行循环的队列,并在完成之前写入所有数据。但是,如果消费者速度很慢且数据很大,这可能会导致系统内存不足 - 因为所有NSData
都存在于调度队列中,直到块完成。
这两种方法都有利有弊。我倾向于选择第一个,因为没有内存问题,连接会将输入字节缓冲到某个上限 - 在它停止确认更多字节之前。