Objective c 如何使用NSURLSession在收到HTTP头后立即获取消息正文?

Objective c 如何使用NSURLSession在收到HTTP头后立即获取消息正文?,objective-c,nsurlsession,nsurlsessiondatatask,Objective C,Nsurlsession,Nsurlsessiondatatask,我想使用NSURLSession从服务器接收xml流,并立即在屏幕上显示每个xml 这是我的代表代码: - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // Enumerate each message-body. [data enumerateByteRangesUsingBlock:^(co

我想使用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.
            // ...
        });
    }];
}
除了一个问题外,该代码工作正常。 问题是,有时在接收流时,didReceiveData不会在didReceiveResponse之后立即调用,它有时会接收多个HTTP消息,然后调用didReceiveData一次以传递它刚刚为我接收的所有消息

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

是否有任何配置或属性可以使其立即调用didReceiveData?我看了文件,但没有发现任何有用的东西

非常感谢

更新: 我试着用NSURLConnection做同样的事情,它运行得很好,没有这个问题。 每个didReceiveData立即在didReceiveResponse后面调用


如何使NSURLSessiondireceivedataNSURLConnection一样工作

IIRC,NSURLSession应在接收数据时发送数据,但仅在接收到一定数量的数据后,或在一段时间后发送

如果您试图获取单独的数据块,您可以考虑将它们作为多部分响应从服务器返回。每个“部分”将包含您的一条消息,您将得到一个新的didReceiveResponse:callback


尽管如此,我不知道为什么NSURLConnection的行为会有所不同。他们在引擎盖下使用了很多相同的代码。您可以尝试向Apple提交一个bug。

您的意思是要解析未完全接收到的xml数据?怎么可能?对不起,我没解释清楚。接收XML流意味着服务器将通过微小的XML连续发送一些信息,直到取消任务为止。因此,我收到的每个邮件正文都是完整的xml。如果这确实是一个流,为什么不使用NSURLSessionStreamTask?NSURLSessionStreamTask在iOS9上可用,但我的应用程序仍然必须支持iOS 8和7。