【问题标题】:CFStreamCreateBoundPair streams lose data with small buffer sizeCFStreamCreateBoundPair 流丢失缓冲区大小较小的数据
【发布时间】:2013-05-17 04:28:43
【问题描述】:

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

CFStreamCreateBoundPair Reference

【问题讨论】:

    标签: objective-c streaming buffer nsurlconnection nsstream


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多