如何在使用NSURLSession接收HTTP标头后立即获取消息体?

时间:2015-11-12 04:19:54

标签: objective-c nsurlsession nsurlsessiondatatask

我想使用 NSURLSession 从服务器接收xml流,并立即在屏幕上显示每个xml。

这是我的委托代码:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {

    // Enumerate each message-body.
    [data enumerateByteRangesUsingBlock:^(const void * _Nonnull bytes, NSRange byteRange, BOOL * _Nonnull stop) {

        // Convert message-body to xml string.
        NSString *string = [[NSString alloc] initWithBytes:bytes 
                                                    length:byteRange.length 
                                                  encoding:NSUTF8StringEncoding];

        dispatch_async(dispatch_get_main_queue(), ^{
            // Some code to display string.
            // ...
        });
    }];
}

除一个问题外,此代码工作正常。 问题是,有时在接收流时, didReceiveResponse 后立即调用 didReceiveData ,它有时会收到多条HTTP消息,然后调用 didReceiveData 一次传递它刚收到的所有消息。

接收多条消息有时需要一段时间,并使我的应用程序无法实时显示xml。

是否有任何配置或属性可以立即调用 didReceiveData ?我阅读了该文档,但没有找到任何有用的信息。

非常感谢。

更新

我尝试使用 NSURLConnection 来做同样的事情,它运行完美而没有这个问题。 立即在 didReceiveResponse 后面调用每个 didReceiveData

如何使 NSURLConnection didReceiveData NSURLConnection 一样工作?

1 个答案:

答案 0 :(得分:0)

IIRC,NSURLSession应该在收到数据时发送数据,但只有在收到一定数据或一段时间后才会发送数据。

如果您尝试获取单个数据块,则可以考虑将其作为多部分响应从服务器发回。每个“部分”都包含您的一条消息,您将获得一个新的didReceiveResponse:每个消息之间的回调。

话虽如此,我不确定为什么NSURLConnection表现不同。他们在引擎盖下使用了很多相同的代码。您可以尝试向Apple提交错误。