【问题标题】:Streaming/Chunked HTTP and NSURLSession Hanging流式传输/分块 HTTP 和 NSURLSession 挂起
【发布时间】:2014-02-16 21:11:26
【问题描述】:

我有这段代码,我一直在尝试移植。该代码在使用 WinHTTP 实现的 Windows 上可以 100% 正常工作。在 IOS 7 模拟器上,我使用的是 NSURLSession。对于常规的 HTTPS 获取/发布似乎可以正常工作。

当我使用“流式”HTTP 时,事情开始崩溃。在这种情况下,内容长度是未知的,因为数据是连续流入的。

我有一个阻塞同步下面的调用,它将等待当前请求完成。当我使用第一个命令时,同步循环将在委托被命中后退出。但是,如果我用注释的第二行替换同步循环挂起。

        [m_pDelegate.session invalidateAndCancel];
//      [m_pDelegate.session finishTasksAndInvalidate];
blockUntilOperationsComplete();

最终它会退出,我确实得到了我的数据回调。我相信回调最终会在 MINUTES 之后触发,因为小的保活消息(16 字节长)最终会溢出缓冲区并触发委托调用。有没有办法降低缓冲阈值?

【问题讨论】:

    标签: ios nsurlsession


    【解决方案1】:

    在此浪费了 2 天之后,我将把它留给下一个经过的灵魂。没有办法通过现有的 NSURL* 类来减少这个缓冲区。事实证明,分块编码的当前实现(在 iOS7 上,似乎永远都是这样)通过等待 512 字节的分块编码有效负载收集来缓冲传入数据,并且只有在此之后才会发生回调 - 重要部分如下 -如果 Content-Type 是“text/html”。之后,所有后续流量触发的回调都将实时发生。

    但是,如果服务器将 Content-Type 标头更改为“application/json”,它将不会被缓冲,并且一旦实际收到某些内容,您的回调就会触发。

    【讨论】:

    • 可悲的是,NSURLSession 仍然是这样......非常可悲的是解决方案是修改服务。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2017-07-08
    • 2013-09-24
    • 2013-12-08
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多