1

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

CFStreamCreateBoundPair 参考

4

1 回答 1

1

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

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

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

两种方法都有优点和缺点。我倾向于第一个,因为没有内存问题,并且连接无论如何都会将传入的字节缓冲到某个上限 - 在它停止确认更多字节之前。

于 2013-05-20T20:32:54.450 回答